驱动程序的任务
通常来讲,驱动(模块)要执行两类任务:
- 模块中的某些函数作为系统调用的一部分执行(按照既定规则填补必需的系统调用模块)
- 其他函数负责终端处理
内核中的并发
为什么考虑并发问题:
- Linux系统中通常正在运行多个并发进程,并且可能有多个进程同时使用我们的驱动程序
- 大多数设备能够中断处理器,而中断处理程序异步运行,并且可能在驱动程序正试图处理其他任务时被调用。
- 有一些软件抽象(比如内核定时器)也在异步运行着
- 可能同时有不止一个CPU运行我们的驱动程序
驱动程序编写人员所犯的一个常见错误是,认为只要某段带代码没有进入睡眠状态(或者阻塞),就不会产生并发问题,但即使在先前的非抢占式内核中,这种假定也是错误的。在2.6版本的代码中,内核代码(几乎)始终不能假定在给定代码段中能够独占处理器。
一些细节
- 应用程序拥有一块很大的栈空间,内核具有非常小的栈,它可能只有4096字节的大小。如果我们需要大的结构,则应该在调用时动态分配该结构。
- 内核代码不恩你各市县浮点数运算。如果打开了浮点支持,在某些架构上,需要在进入或退出内核空间时保存和恢复浮点处理器的状态。这种额外的开销没有任何价值,内核代码中也不需要浮点运算。