1 设备驱动程序简介
设备驱动程序
就是进入Linux这类开源操作系统内核的入口
大多数编程问题可以实际分为两部分:“需要提供什么样的功能”(机制
),“如何使用这些功能”(策略
)。前者对应驱动程序
,后者对应应用程序
。应该尽可能让驱动程序不带策略。
不带策略的驱动程序包含下列的典型特征:
- 同时支持同步和异步操作
- 能够被多次打开
- 充分利用硬件特性
- 不具备用来"简化任务"的或提供策略相关的软件层。
- …
1.1 内核功能划分
- 进程管理:创建和销毁进程,处理与外部世界之间的连接(输入输出)。
- 内存管理: 虚拟地址空间
- 文件系统: 没有结构的硬件上构造结构化的文件系统,支持多种文件系统类型(物理介质上组织数据的不同方式)
- 设备控制: 为每个外设嵌入相应的驱动程序
- 网络功能: 在应用程序和网络接口之间传递数据包,并根据网络活动控制程序的执行。
1.2 可装载模块
内核提供的特性可以在运行时进行扩展,在运行时添加到内核中的代码被称为模块
。每个模块由目标代码
组成,使用insmod
连接到正在运行的内核,rmmod
移除连接。
1.3 设备和模块的分类
Linux系统将设备分成3中基本类型: 字符设备
,块设备
,网络设备
。
- 字符设备: 能够像
字节流
一样被访问的设备,至少要实现open
,close
,read
和write
系统调用。比如/dev/console(字符终端)和/dev/ttys0(串口)。和普通文件的区别是大部分只能顺序访问数据。 - 块设备: 每次只能传输一个或多个完整的
块
,每块包含512字节或更多,但linux也可以像字符设备一样读取数据,区别在于内核管理数据的方式(内核与驱动程序之间的接口) - 网络接口: 由内核中的
网络子系统
驱动,负责发送和接收数据包,名字为eth0,但是在文件系统中不存在对应的节点。
根据支持给定类型设备来划分可以分为:通用串行总线(USB) 模块
,串行橾块
,SCSI块
1.4 安全问题
系统调用init_module
会检查调用进程是否具有将模块装载到内核的权利。
不要运行一个预先编译好的不熟悉的内核。
1.5 版本编号
内核版本为x.x.x,其中第1位数字为主版本号
,重大变化时才修改,。第2位数字为次版本号
,偶数为稳定版,奇数为开发过程的一个快照,第3位数字为修订版本。
1.6 许可证条款
Linux内核遵循GNU通用公共许可证(GPL)。GPL允许用户自由使用,修改和分发软件,但是分发时必须附带源代码。GPL允许用户在遵循GPL条款的情况下,将软件作为商业产品进行销售。
1.7 Linux内核邮件列表(LKML)
Linux kernel是由分布在世界各地的大牛们共同开发、维护的,这就需要一种交流工具,这种工具就是LKML。因而LKML主要有如下功能:
- patch的提交、审查
- patch、版本等发布公告
- 技术讨论、辩论
- 打口水仗
LKML地址