01 设备驱动程序简介
#1 设备驱动程序的作用
& 设备驱动程序的作用在于提供机制,而不是策略。
所谓机制,即“需要提供什么样的功能”;所谓“策略”,即“如何使用这些功能”。前者精于设计,专注细节;后者实现调用,不需要知道任何与硬件相关的信息。
& 决定设备驱动通常不带策略的主要原因是:不同的环境需要不同的方式来使用硬件,而设备驱动针对底层硬件,不可能为每一种方式都编写一个策略。因此,我们让驱动程序提供机制,而让系统高层提供策略。
当然,有时候我们也要在驱动程序当中实现一些策略。例如,某个数字 I/O 驱动程序只提供以字节为单位访问硬件的方法,这样就可以避免编写额外的代码来处理单个数据位的麻烦。
& 不带策略的驱动程序的典型特征:
1) 同时支持同步与异步操作;
2) 驱动程序能够被多次打开;
3) 充分利用硬件特性;
4) 不具备用来“简化任务”的 或 提供与策略相关的软件层。
& 实际上,许多设备驱动程序是与用户程序一起发行的。这些用户程序主要用来帮助配置和访问目标设备。同时附带发行的还有一个客户程序库,它提供了那些不必在驱动程序本身实现的功能。
#2 内核功能划分
& 进程管理:创建和销毁进程,进程处理,进程间通信,进程调度;[架构相关代码——CPU]
& 内存管理:内核在有限的可用资源之上为每个进程都创建了一个虚拟地址空间,内核的不同部分在和内存管理子系统交互时使用一组函数调用;[内存管理器——内存]
& 文件系统:内核在没有结构的硬件上构造结构化的文件系统,而文件抽象在整个系统中广泛使用;文件系统是一个软件驱动程序,它将底层数据结构映射到高层数据结构;不同的文件系统类型,代表着在块设备上组织数据的不同方式;[文件系统类型和块设备——磁盘和CD]
& 设备控制:几乎每一个系统操作最终都会映射到物理设备上,除了极少数的几个对象之外,所有的设备控制操作都由被控制设备相关的代码来完成,这段代码就叫做驱动程序;[字符设备——控制台]
& 网络功能:由于数据包的传入是异步事件,因此大部分网络操作与具体进程无关,而必须由内核来完成;[网络子系统和 IF drivers——网络接口]
#3 可装载模块和模块的分类
& 内核提供的特性可在运行时进行扩展,扩展包括添加和移除,这些可被扩展的代码称为“模块”;每个模块由目标代码组成,我们可以使用 insmod 将模块连接到正在运行的内核,也可以使用 rmmod 移除连接;
& 在内核中以模块方式实现的功能:文件系统类型、块设备、字符设备、IF drivers 等;
& Linux 系统将设备分为三种基本类型:字符设备、块设备、网络设备;
1) 字符设备:字符设备是个能够像字节流一样被访问的设备,字符设备驱动程序应至少实现 open 、close、read 和 write 调用;字符设备可以通过文件系统节点来访问,例如:/dev/tty1 和 /dev/lp0 等;字符设备文件与普通文件的唯一区别在于,大多数(除极少数之外)字符设备文件是一个只能顺序访问的数据通道,而对普通文件的访问则可以前后移动访问位置;
2) 块设备:和字符设备一样,块设备也是通过 /dev 下的文件系统节点来访问的,不同的是,块设备上可以容纳文件系统;块设备和字符设备的区别仅仅在于内核内部管理数据的方式,而这些对用户是不透明的;
3) 网络设备(接口):任何网络事务都经过一个网络接口形成;网络接口由内核中的网络子系统驱动,负责发送和接收数据包,但不涉及数据包的映射问题;由于不是面向流的设备,因此不将网络接口映射到文件系统节点,而是通过给它们分配一个唯一的名字(如eth0);
#4 Linux 内核版本编号
& 内核版本号: 以版本号 2.6.9-5.ELsmp 为例:
r: 2 , 主版本号
x: 6 , 次版本号,偶数表示稳定版本,奇数表示开发中版本
y: 9 , 修订版本号 , 表示修改的次数
头两个数字合在一齐可以描述内核系列。如稳定版的2.6.0,它是2.6版内核系列。
-5: 表示这个当前版本的第5次微调 patch
ELsmp : 指出了当前内核是为 EL 和 smp特别调校的
EL : Enterprise Linux ; smp : 表示支持多处理器
另外,还有支持大内存版本的 bigmem 或 hugemem