1 引言
Linux内核黑客习惯深入Linux内核代码,找到精神食粮,并有能力增加某个新功能或者优化某个子系统的性能。
2 设备驱动程序的定义
驱动程序就是使硬件工作的一种特殊软件,它运行在操作系统的内核空间(虚拟地址0xC0000000到0xFFFFFFFF),封装硬件细节,服务于系统调用。
3 机制和策略
3.1需要提供什么功能(机制)如何使用这些功能(策略)。
机制和策略的区分是其中一个在Unix 设计背后的最好观念. 大部分的编程问题 其实可以划分为两部分:"提供什么能力"(机制) 和 "如何使用这些能力"(策略). 如果这两方面由程序的不同部分来表达, 或者甚至由不同的程序共同表达, 软件包是非常容易开发和适应特殊的需求.
3.2不带策略的驱动程序包括一些典型的特征
(1)同时支持同步和异步操作
(2)驱动程序能够被多次打开
(3)充分利用硬件特性
4 内核功能划分
4.1进程管理
内核负责创建和销毁进程,并处理它们与外部世界的联系(输入和输出). 不同进程间通讯(通过信号, 管道,或者进程间通讯原语)对整个系统功能 来说是基本的, 也由内核处理. 另外, 调度器,控制进程如何共享 CPU, 是进程管理的一部分. 更通常地, 内核的进程管理活动实现了多个进程在 一个单个或者几个 CPU 之上的抽象.
4.2内存管理
计算机的内存是主要的资源,处理它所用的策略对系统性能是至关重要的. 内核为所有进程的每一个都在有限的可用资源上建立了一个虚拟地址空间.内核的不同部分与内存管理子系统通过一套函数调用交互, 从简单的malloc/free 对到更多更复杂的功能.
4.3文件系统
Unix 在很大程度上基于文件系统的概念; 几乎 Unix 中的任何东西都可 看作一个文件. 内核在非结构化的硬件之上建立了一个结构化的文件系统, 结果是文件的抽象非常多地在整个系统中应用.另外, Linux 支持多个文 件系统类型, 就是说, 物理介质上不同的数据组织方式. 例如, 磁盘可被 格式化成标准 Linux 的 ext3 文件系统, 普遍使用的FAT 文件系统, 或 者其他几个文件系统.
4.4设备控制
几乎每个系统操作最终都映射到一个物理设备上.除了处理器, 内存和非 常少的别的实体之外, 全部中的任何设备控制操作都由特定于要寻址的设 备相关的代码来进行. 这些代码称为设备驱动.内核中必须嵌入系统中出 现的每个外设的驱动, 从硬盘驱动到键盘和磁带驱动器.内核功能的这个 方面是本书中的我们主要感兴趣的地方.
4.5网络功能
网络必须由操作系统来管理,因为大部分网络操作不是特定于某一个进程: 进入系统的报文是异步事件.报文在某一个进程接手之前必须被收集, 识 别, 分发. 系统负责在程序和网络接口之间递送数据报文, 它必须根据程 序的网络活动来控制程序的执行. 另外, 所有的路由和地址解析问题都在 内核中实现.
5可装载模块
(1)内核提供的特性可在运行时进行扩展
(2)运行时添加到内核中的代码被称为“模块”
(3)每个模块由目标代码组成
(4)insmod, rmmod
6 设备和模块的分类
6.1 字符设备
(1)字符设备是个能够像字节流一样被访问的设备
(2)至少实现open、close、read和write系统调用
(3)字符终端(/dev/console)和串口(/dev/ttys0)
6.2块设备
(1)通过/dev目录下的文件系统节点来访问
(2)传输一个或多个完整的块,每块通常是512字节
6.3 网络接口
(1)任何网络事务都经过一个网络接口形成,即一个能够和其他主机交换数据的设备
(2)接口是个硬件设备,但也可能是个纯软件设备,比如回环(loopback)接口
6.4文件系统类型是个软件驱动程序,文件系统模块必须实现访问目录和文件的最底层系统 调用
7安全问题
(1)留心影响全局资 源的设备操作( 例如设置一条中断线 )
(2)缓冲区溢出
(3)小心对待来自用户空间的内存
(4)小心使用第三方获得的软件(已编译)