Linux——Linux驱动之基本理论常识总结(什么是Linux驱动?Linux驱动需要掌握哪些?ARM处理体系架构及前世今生)

举报
Winter_world 发表于 2022/03/16 10:32:10 2022/03/16
【摘要】 0 引言 前面Linux专题中关于Linux下系统编程总结了17篇博文,主要是为了提高Linux下的C编程应用能力,熟悉Linux编程应用环境,从此篇博文起开始Linux驱动的总结,后面计划加一些综合实践项目练习。 1 什么是Linux驱动? 做过嵌入式的都知道裸机程序和带操作系统的程序,这里就不展开讲了,初学者最开始接触的都是裸机程序,main中while大循环跑天下。实际上,掌握了操作系

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!

QT开发实战

嵌入式通用开发实战

《从0到1学习嵌入式Linux开发》

《Android开发实战》

《实用硬件方案设计》

 长期持续带来更多案例与技术文章分享;

欢迎商业项目咨询,10年+软硬全栈内功,助力解决您的尊贵需求。

——————————————————————————————————

目录

0 引言

1 什么是Linux驱动?

2 Linux驱动程序需要掌握的内容

3 Linux驱动可参考的资源

4 ARM处理器体系架构

5 ARM的前世今生


0 引言

前面Linux专题中关于Linux下系统编程总结了17篇博文,主要是为了提高Linux下的C编程应用能力,熟悉Linux编程应用环境,从此篇博文起开始Linux驱动的总结,后面计划加一些综合实践项目练习。

1 什么是Linux驱动?

做过嵌入式的都知道裸机程序和带操作系统的程序,这里就不展开讲了,初学者最开始接触的都是裸机程序,main中while大循环跑天下。实际上,掌握了操作系统后,我们会发现基于操作系统的开发更高效,可以分工协作,A去开发应用层软件,B去开发操作系统相关的,C去开发驱动程序,D做底层硬件。

说到这里,从顶层到底层正好是A到D的顺序,驱动程序就是联接操作系统和硬件之间的桥梁,驱动程序多半都是和硬件打交道的,如何让硬件更好、稳定的运行起来,这就是看驱动程序的好坏了,它对上需要提供硬件操作的相关接口。对于顶层的应用软件,无法直接调动硬件,是通过操作系统调用驱动程序提供的接口间接进行的,这样各层各司其职,对于整体系统来说也更稳定可靠,假如每个应用都能直接操作硬件,那才是最大的隐患。

Linux驱动又具体包含三种:一般后两种,处理器厂家都会提供BSP支持包,我们不需要做什么,开发中涉及最多的就是字符设备。

  • 字符设备驱动:大部分都是字符设备,如GPIO、LED、串口、蜂鸣器、声卡等
  • 块设备驱动:存储设备,如U盘、硬盘、TF卡等
  • 网络设备驱动:通信设备,如wifi、以太网等

2 Linux驱动程序需要掌握的内容

1)GPIO,通用输入输出口

单片机中只需要对寄存器进行设置操作就可以了,但在高端处理器中,就没那么简单了。

2)内存管理单元MMU

MMU是单片机和处理器的一个区别,普通的51单片机一般叫MCU(微控制器),ARM处理器一般叫MPU(微处理器),后者加入了内存管理单元。MMU是一种负责处理处理器的内存访问请求的硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制,在较为简单的计算机体系结构中,负责总线的仲裁以及存储体切换。

3)Linux中一切皆文件

Linux中一切都被看成是文件,把设备也看成文件,所以字符设备驱动的编程路子就是做一组设备对应的驱动函数,使能能用open、read、write、ioctrl、close像操作文件一样进行操作。

4)设备节点

要想用户进程与内核下的硬件进行通信,就需要建立一个设备节点,前面Linux系统编程时也是见过的,比如在开发板新插上一个U盘,使用fdisk -l指令查看,/dev/sda1就是我们新插U盘的一个设备节点。

5)上层应用如何操作外部设备

这个应该说是做嵌入式的一个常规操作了,简单说下,大致思路基本都是一样的,举个很简单例子,我们要用控制器的某个 IO 口开关蜂鸣器,该如何操作:首先根据原理图确定是那个pin,然后去控制器的datasheet中查找操作这个IO口的对应寄存器,明确物理地址,然后根据手册要求向该物理地址写数据控制IO口输出高低电平,进而控制了蜂鸣器的关断。

写到这里,是不是感觉和刚上大学时玩51单片机的套路差不多?是的,其实裸机程序中都是这么操作外设的,但是如果上了Linux,启动了MMU,就不是直接对物理地址进行操作了,而是把物理地址先转换为虚拟地址,然后对虚拟地址进行操作的。

6)底层驱动的编写方式,并注册到系统(register_chrdev())

7)MISC杂项设备(混杂设备):简化了驱动的编写

8)模块(module):驱动调试时以模块的形式进行驱动的加载和卸载

3 Linux驱动可参考的资源

Linux本身就是一个开源软件,开源的好处大家都知道,资料丰富,我们做Linux驱动开发,能找到技术支持和相应资源的有如下,列出的,对于新手来说,建议最佳的顺序是从1到5:

1)开发板厂家:比如原子、讯为等,提供大量的学习资料,这个对于新手小白来说建议是首选的;

2)Linux开发工程师:这个就是广大的开发网友了,有论坛、有博客等参照学习。

3)主控芯片原厂:如iMX6、4412等,原厂会在Linux官方代码基础上,加入适配自己主控的SDK等;

4)外设芯片原厂:比如4G、wifi、声卡、显卡芯片等,这么复杂的全自己搞可麻烦了,这些外设原厂会给对应的驱动,我们自己参照移植即可;

5)Linux官方:https://www.kernel.org,有Linux原始的内核代码;

Linux驱动如何学习和理解,借用大神总结的话,在此记录下,我初次看时感觉很受用,理解的很到位:

上层是文件系统和应用,中层是Linux内核,下层是底层硬件,Linux驱动是介于文件系统和底层硬件之间的,是嵌入到内核中的程序,应用是嵌入到文件系统中的程序,比如Android APP。

对上:Linux设备驱动给上层提供调用的接口;

对中:Linux设备驱动要注册到内核中,标准说法是 挂载在总线上;

对下:直接操作硬件,如GPIO、IIC、SPI、PWM等;

以上三个,Linux内核都提供了大量的接口函数、结构体,其实Linux驱动,就是掌握了这些东西怎么用,适应到自己要写的驱动程序中。

4 ARM处理器体系架构

ARM体系架构中区别于单片机的比较突出的体现在有了CACHE 高速缓存和MMU 内存管理单元,ARM体系架构还是比较繁杂的,我们一步步说起,有些基础的概念,就当是温故学习了。

1) CPU中央处理器

CPU到现在都在遵循经典的 冯诺依曼存储结构,CPU其实就是一堆数字电路,与门、或门、非门、触发器等组成,这些单个拿出来都认识,放在一起就复杂了。每个处理器(51、PIC、ARM、X86)都有自己对应的一套指令系统,处理的数字电路就是对套指令系统进行解析,并不断从存储器中按顺序取指令去执行。后来,在冯诺依曼结构基础上,又有了创新的哈佛结构,取指令和取数据分开,可以同时进行。

扩展的点一下,评价一个处理器一般从四方面:频率、性能(MIPS/MHz,MIPS指的是每秒能够处理的指令数)、功耗、面积。

2)指令系统

可以把它看成是一套API,一个软硬件的分界面,这是在计算机系统体系结构中比较重要的思想。对于软件开发人员,只需要知道指令系统就行,知道每一条指令的作用,直接调用指令去实现要操作的功能,至于怎么实现这个操作的,不需要自己掌握;对于处理器设计人员,需要做的是把指令解析,执行。

指令系统分两类:RISC 经典指令集和CISC复杂指令集,早期的处理器如8051、X86用的是CISC,ARM、MIPS、PowerPC等都是用的RISC,RISC指的是每条指令执行的时间相同,指令长度相同,为什么后期会有RISC呢?存在即合理,RISC的指令执行时间和指令长度相同的特点,便于实现流水线,可以使一些多项操作在时间上进行重叠进行,便于提高系统的主频,进而提高处理性能。

3)Cache高速缓存

Cache高速缓存,是CPU与内存之间的高速存储子系统,作用就是为了提高CPU访问内存的速度,高速缓存一般是SRAM,内存一般是DRAM,后者成本较低些。

为什么说高速缓存的存在提高CPU访问存储器的速度?原理是这样的,CPU存取数据首先到高速缓存中去找,若找到的话直接就用,没有的话就会到存储器中去找,同时这部分指令或相关的数据会放到内存中,CPU下次再存取数据的话,就直接能从高速缓存中获取了,总体上提高了系统性能,提高了存储器的平均访问速度,使存储器的速度和CPU的速度匹配。

既然高速缓存速度这么快(一般CPU访问速度是寄存器>高速缓存>内存),那么CPU直接集成大点的高速缓存不就OK了吗,为什么还有额外配置内存呢?答案就是它贵啊,采用CPU+高速缓存+内存的架构性价比较高,也不仅仅是贵的问题,另外,比较重要的一点是,处理器和存储器的性能差距每年大约在以50%d的速度增大,像CPU每18个月其性能都会翻一番,但是存储器发展速度就没那么快了(跟器件工艺相关性比较大),所以采用这种架构很好的平衡了这两点。

4)内存管理单元MMU

内存管理单元实现了虚拟地址到物理地址的转换,ARM上面跑Linux系统,编程用的地址都是虚拟地址,物理地址到虚拟地址的转换是通过ioremap函数实现的。MMU其实就是维护下面这样一个映射表格,ioremap通过查找这个映射表实现虚拟地址到物理地址的转换。

MMU主要应用方面的作用包括:辅助实现虚拟内存、辅助实现多任务管理。

虚拟存储器的空间大小取决于处理器的访存能力,不是实际外存的大小,比如ARM处理器有32、64位系统,32位系统2^32=4G,说明处理器有能力访问4G内存的范围,也就是程序开发人员可以操作的内存范围是4G的,就算实际内存有8G,也只能操作4G的空间,这就是为什么我们PC机8G的内存,一般都是装的64位系统的原因,否则就是浪费硬件嘛。

虚拟内存可以实现既具有外存的容量(PC机中的硬盘、ARM系统中的EMMC/FLASH),又有接近内存的访问速度的效果。

5 ARM的前世今生

ARM全名Advanced Risc Machines,Ltd,ARM公司是1990年成立的,这个公司牛的是自己并不产芯片,是设计公司,只提供IP,处理器的设计方案,ARM芯片厂商需要从ARM手里买IP核做自己的ARM芯片。主要ARM芯片厂商有哪些?我们常见的:

外企:SAMSUNG、TI、Freescale、Intel、NXP、Atmel

国产:联发科、华为、瑞芯微、全志,现在IC国产化兴起,还有很多国内公司,像中科芯、紫光展锐等。

ARM处理器的架构(指的是结构设计)从V3发展到V8,这里的架构不是具体的产品,类似于设计框架,具体的产品像ARM7、ARM8、ARM11、Cortex的A/R/M系列,下面是网络上找的一张图,参考下,发展的时间线也是这样走的。ARM处理器目标就是做出低功耗、低成本的方案,其大量使用了寄存器、指令长度固定,具有领先的性能和功耗。

目前主流的Cortex系列,包含了A、R、M、Secure四个分支,A 系列是性能最强悍的,面向平板电脑应用等,可以说对标 X86了;R系列面向实时处理场景,像工业控制、汽车领域;M系列性价比较高,一般民用、消费品等;Secure系列主要面向安全产品。可以看出ARM公司基本把所有的领域都覆盖了,这个公司还是比较可怕的。


作于202104062140,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。