1.什么是驱动?
字面意思驱动指驱使一个东西,让它动起来。
2.什么是linux驱动
驱动的本质是电力驱动,而驱动代码只是给出了操作方法。
3.linux体系架构
分层思想
驱动的上面是系统调用API
驱动的下面是硬件
驱动自己本身也是分层的
4.linux的模块化设计
4.1微内核和宏内核(也说明了linux内核的紧耦合和松耦合的概念)
- 宏内核(又称为单内核):将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效。
- 微内核:功能被划分成独立的过程,过程间通过IPC(进程间通信)进行通信。模块化程度高,一个服务失效不会影响另外一个服务。典型如windows
- linux:本质上是宏内核,但是又吸收了微内核的模块化特性,体现在2个层面。
4.2静态模块化
编译时功能可裁剪,特征是想要功能的裁剪改变必须要重新编译。
4.3动态模块化
zImage可以不重新编译烧录,甚至不关机重启就实现模块的安装和卸载。
5.linux设备驱动分类
5.1驱动分类
- 分3类:字符设备驱动、块设备驱动、网络设备驱动
- 分类原则:设备本身读写操作的特征差异
5.2三类驱动程序详细对比分析
- 字符设备,准确的说应该叫“字节设备”,软件操作设备时是以字节为单位进行的。典型的如LCD、串口、LED、蜂鸣器、触摸屏······
- 块设备,块设备是相对于字符设备定义的,块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。设备的块大小是设备本身设计时定义好的,软件是不能去更改的,不同设备的块大小可以不一样。常见的块设备都是存储类设备,如:硬盘、NandFlash、iNand、SD····
- 网络设备,网络设备是专为网卡设计的驱动模型,linux中网络设备驱动主要目的是为了支持API中socket相关的那些函数工作。
5.3为什么字符设备驱动最重要
- 常见大量设备都属于字符设备
- 举例说明非标准类型字符设备驱动
6.驱动程序的安全性要求
6.1驱动是内核的一部分
- 驱动已经成为内核中最庞大的组成部分
- 内核会直接以函数调用的方式调用驱动代码
- 驱动的动态安装和卸载都会“更改”内核
6.2驱动对内核的影响
- 驱动程序崩溃甚至会导致内核崩溃
- 驱动的效率会影响内核的整体效率
- 驱动的漏洞会造成内核安全漏洞
6.3常见驱动安全性问题
- 未初始化指针
- 恶意用户程序
- 缓冲区溢出
- 竞争状态