一、什么是驱动
1、理解驱动的概念
- (1)驱动一词的字面意义、物理上的驱动、硬件中的驱动。
- (2)Linux 内核驱动:即软件层面上的驱动,指的是这段代码操作了硬件使其动起来,所以叫硬件的驱动程序(本质上是电力提供了动力,而驱动程序提供了操作的逻辑方法)。
2、Linux 体系架构
- (1)分层思想:大致可以分为两层,上层是应用,下层是操作系统,驱动、文件系统等程 序包含于 OS 中,上层应用通过 API 调用 OS 中的驱动程序。
- (2)驱动上面是系统调用 API,下面是硬件。
- (3)驱动自己本身也是分层的
二、模块化设计
1、微内核和宏内核
- (1)宏内核:又称为单内核,将内核从总体上作为一个大过程实现,运行在一个独立的地 址空间,所有内核服务都在一个地址空间运行,相互之间直接调用函数,简 单高效。
- (2)微内核:各个功能被划分成独立的进程,进程间通过 IPC 通信,模块化程度高,一个 服务失效不会影响另一个服务,典型的如 Windows。
2、Linux 本质上是宏内核,但是又吸收了微内核的模块化特性,体现在两个层面
- (1)静态模块化:在编译时实现可裁减,特征是想要裁剪功能必须重新编译。
- (2)动态模块化:zImage 可以不重新编译烧录,甚至可以不关机重启就能实现模块的安装 和卸载。==前提在系统启动后,你得手动挂载
三、Linux 设备驱动分类
1、驱动分类
- (1)3 类:字符设备、块设备、网络设备。
- (2)分类原则:设备本身读写操作的特征差异
2、三类驱动程序详细对比分析
- (1)字符设备:准确的说应该叫“字节设备”,即软件操作设备时是以字节为单位进行的, 典型的有 LCD、键盘、鼠标、串口、LED、蜂鸣器、触摸屏。
- (2)块设备:软件操作时是以块(多个字节组成块)为单位进行的,设备的块大小是设备 本身定义好的,软件无法修改,不同设备的块大小不一样。常见的块设备都 是存储类设备:如硬盘、U 盘、光盘、NandFlash、iNand、SD 卡。
- (3)网络设备:是专为网卡设计的驱动模型,Linux 中的网络设备驱动主要是为了支持 API 中 socket 相关的函数。
3、为什么字符设备最重要
- (1)常见的大量设备都属于字符设备。
- (2)除了以上列举的标准字符设备,通常还有一些非标准类型字符设备驱动,如将一块产 生特定波形的 FPGA 当做一个字符设备来控制的驱动程序。
四、驱动程序的安全性要求
1、驱动程序是内核的一部分
- (1)驱动程序已经成为内核中最庞大的组成部分,且内核会直接以调用函数的方式调用驱动程序。
- (2)驱动程序的动态安装和卸载都会“更改”内核
2、驱动对内核的影响
- (1)驱动程序崩溃甚至会导致系统崩溃。
- (2)驱动程序的效率会影响内核的整体效率。
- (3)驱动的漏洞会造成内核安全漏洞。
3、常见的驱动安全性问题
- (1)未初始化指针。
- (2)恶意用户程序。
- (3)缓冲区溢出。
- (4)竞争状态。
五、驱动应该怎么学
1.先学好 C 语言
2.掌握相关预备知识
- (1)硬件操作相关知识
- (2)应用层 API
3、驱动学习阶段
- (1)注重实践,一步一步写驱动。
- (2)框架思维,多考虑整体和上下层。
- (3)先通过简单设备学习 Linux 驱动框架。
- (4)学会总结、记录。