一、什么是驱动?
1: 驱动一词的字面意思
2: 物理上的驱动
3: 硬件中的驱动
4: linux内核驱动。软件层面上的驱动广义上是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序。
狭义上驱动程序就是专指操作系统中用来操控硬件的逻辑方法的部分代码。而我们这里讲的驱动就指的是这个狭义上的驱动。
二、Linux驱动的体系架构
1: 分离、分层思想
2: 驱动的上面是系统调用API
3: 驱动的下面是硬件
4: 驱动本身的实现也是基于分离、分层的思想
三、模块化设计的思想
1、微内核和宏内核(操作系统设计的两种思路)
(1)宏内核(又称为单内核):将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简
单高效。坏处就是紧耦合,一个动了其他的也要跟着动,因为他们都是一起编译的,就好比我们平时写的裸机程序一样,编译成一个可执行文件的。
(2)微内核:功能被划分成独立的过程,过程间通过IPC进行通信。模块化程度高,一个服务失效不会影响另外一个服务。典型如windows
(3)linux:本质上是宏内核,但是又吸收了微内核的模块化特性,提现在2个层面
2、动态模块化和静态模块化
(1)静态模块化:在内核编译时实现可裁剪,特征是想要功能裁剪改变必须重新编译
(2)动态模块化:zImage可以不重新编译烧录,甚至可以不关机重启就实现模块的安装和卸载。
四、驱动的分类
1、驱动分类
(1)分3类:字符设备驱动、块设备驱动、网络设备驱动
(2)分类原则:设备本身读写操作的特征差异
时刻要注意一点,我们的驱动本质上是不分类的,因为我们的硬件是不同的,有不同的读写特性,所以的硬件是分类的,所以我们的驱动也就要跟着分类了。
2、三类驱动程序详细对比分析
(1)字符设备,准确的说应该叫“字节设备”,软件操作设备时是以字节为单位进行的。典型的如LCD、串口、LED、蜂鸣器、触摸屏······
(2)块设备,块设备是相对于字符设备定义的,块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。设备的块大小是设备本身设计时定义好的,软件是不能去更
改的,不同设备的块大小可以不一样。常见的块设备都是存储类设备,如:硬盘、NandFlash、iNand、SD····操作块设备时,我们必须以块单位进行操作,将一块的
数据读取到内存中去,然后在内存中找到相应的那个字节数据修改之后再以一块的数据写入到我们的块设备中去。
(3)网络设备,网络设备是专为网卡设计的驱动模型,linux中网络设备驱动主要目的是为了支持API中socket相关的那些函数工作。
3、为什么字符设备驱动最重要
(1)常见大量设备都属于字符设备
(2)举例说明非标准类型字符设备驱动
五、驱动程序的安全性要求
1、驱动是内核的一部分
(1)驱动已经成为内核中最庞大的组成部分
(2)内核会直接以函数调用的方式调用驱动代码
(3)驱动的动态安装和卸载都会“更改”内核
2、驱动对内核的影响
(1)驱动程序崩溃甚至会导致内核崩溃
(2)驱动的效率会影响内核的整体效率
(3)驱动的漏洞会造成内核安全漏洞
3、常见驱动安全性问题
(1)未初始化指针
(2)恶意用户程序
(3)缓冲区溢出
(4)竞争状态
参考: 《朱友鹏嵌入式Linux开发5.Linux驱动开发5.1.驱动应该怎么学》