Linux设备驱动与缓存机制解析
1. 字符设备驱动
字符设备的处理相对简单,通常不需要复杂的缓冲策略,也不涉及磁盘缓存。不过,不同字符设备的需求存在差异。有些字符设备需要实现复杂的通信协议来驱动硬件设备,而另一些则只需从硬件设备的几个I/O端口读取少量值。例如,多端口串口卡设备(提供多个串口的硬件设备)的设备驱动程序比总线鼠标的设备驱动程序复杂得多。
与字符设备驱动相比,块设备驱动本质上更为复杂。应用程序有权反复请求读取或写入同一数据块,而且对这些设备的访问通常非常缓慢。这些特性对磁盘驱动程序的结构产生了深远影响。不过,内核提供了诸如页缓存和块I/O子系统等复杂组件来处理这些问题。下面我们重点关注字符设备驱动。
字符设备驱动由cdev结构描述,其字段如下表所示:
| 类型 | 字段 | 描述 |
| ---- | ---- | ---- |
|struct kobject|kobj| 嵌入式kobject|
|struct module *|owner| 指向实现该驱动程序的模块的指针(如果有) |
|struct file_operations *|ops| 指向设备驱动程序的文件操作表的指针 |
|struct list_head|list| 与此字符设备的设备文件相关的inode