Linux驱动应该怎么学
一、什么是驱动
1.理解驱动的概念
- 驱动的字面意思:让一个东西动起来
- 物理学上的驱动
- 硬件上的驱动
- Linux内核驱动:软件层面的驱动广义上是指,这一段代码操作了硬件去动作,所以这一段代码就叫硬件的驱动程序。(本质上是电力提供了动力,而驱动程序提供了操作逻辑方法)。狭义上的驱动程序是专指操作系统中用来操控硬件的逻辑方法的代码。
2.linux体系架构
- 要有分层思想
- 驱动的上面是系统调用API
- 驱动的下面是硬件
- 驱动自己本身也是分层的
二、模块化设计
1. 宏内核和微内核
- 宏内核(又称为单内核):将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效(效率高)。
- 微内核:功能被划分成独立的过程,过程间通过IPC(进程间通信)进行通信。模块化程度高,一个服务失效不会影响另一个服务。典型例如Windows。
- Linux:本质上是宏内核,但是又吸收了微内核的模块化特性,体现在下面两个层面:静态模块化和动态模块化。
2.静态模块化
在编译时实现裁剪,想要功能改变必须重新编译。
3.动态模块化
zImage(linux内核镜像文件)可以不重新编译烧录,甚至可以不关机重启就可以实现模块的安装和卸载。
三、linux设备驱动分类
1.驱动分类
- 分3类:字符设备驱动,块设备驱动,网络设备驱动
- 分类原则:设备本身读写操作的特征差异
2.三类驱动程序详细对比分析
- 字符设备:按照一个字符一个字符操作的设备,例如LCD,串口,蜂鸣器。常见大量设备都是字符设备。
- 块设备:相对于字符设备,块设备用软件操作时是以块(多个字节构成的)为单位的,设备的块大小是设备本身设计时定义好的,软件是不能去更改的,不同设备的块大小可以不一样。例如硬盘,SD卡等存储类设备。
- 网络设备:网络设备是专为网卡设计的驱动模型,网络通信有专门的接口,linux中网络设备驱动的主要目的是为了支持API中socket相关的函数工作。
四、驱动程序的安全性要求
1.驱动是内核的一部分
- 驱动已经成为内核中最庞大的组成部分。
- 内核会直接以函数调用的方式调用驱动代码。
- 驱动的动态安装和卸载都会“更改”内核。
2.驱动对内核的影响
- 驱动程序崩溃有可能会导致内核崩溃。
- 驱动的效率会影响内核的整体效率。
- 驱动的漏洞会造成内核安全漏洞。
3.常见驱动安全性问题
- 未初始化指针(野指针)
- 恶意用户程序
- 缓冲区溢出
- 竞争状态
5.驱动应该这么学
1.先学好C语言
2.掌握相关预备知识
- 硬件操作方面
- 应用层API