字符型设备驱动介绍
字符设备主要是给一些传输速率较低,主要用于控制的设备所使用的驱动框架。
如鼠标,键盘,打印机。
字符设备驱动基本结构和API
cdev的代码在/fs/char_dev.c中
编写,编译并安装简单的内核模块
本文主要介绍了以下内容:
注意
- 文章中的所有Example都基于ARM架构
- Licence: GPL
module也就是模块,其优点在于可以动态扩展核心部分的功能而无需将整个软件重新编译连接。广义上来说,Windows上动态链接库DLL是一种module. Linux中的共享库so也可以称为module.
而本文中的module,特指Linux内核模块。Linux内核模块可以在系统运行期间动态扩展系统功能而无需重新启动或者无需重新编译整个系统。内核模块的这个特性为Linux内核的开发者提供了很大的便利。
推荐书籍:《C和指针》
sysfs是一个基于ram的文件系统。sysfs根据kobject框架,将内核中的数据结构、属性文件、相互关系通过文件系统的方式表现出来,并提供了内核空间和用户空间交互的一种方式。
我们讨论一个文件系统,首先要知道文件系统的信息来源在什么地方。如使用mout挂载一个分区mount -t vfat /dev/hda2 /mnt/c
可以知道挂载在/mnt/c下的是一个vfat类型的文件系统,其信息来源是硬盘的第二个分区。而sysfs的挂载过程如下所示:mount -t sysfs sysfs /sys
上述命令看起来没法理解,其实因为sysfs是一个虚拟文件系统,没有实际存放文件的戒指。其信息来源是设备基于kobject构成的设备层次。
bus, device, driver作为整个系列文章的第四篇,将会介绍Linux设备驱动模型的中层抽象,也就是bus、device、driver.
总线(bus)是处理器和一个或者多个设备之间的通道。在设备模型中,所有的设备都通过总线连接。总线既可以是实际物理总线(I2C等)的抽象,也可以是处于Linux设备驱动模型架构需要而虚拟出的”平台总线“。
符合Linux设备驱动模型的device和driver必须挂载在同一根总线上。
究竟kset是什么?为什么需要kset?
这是我在最初看Linux设备驱动模型的时候,最困惑的问题。
概括的说,kset是相似类型的kobject的集合,也就是相似类型kobject的容器(这里的相同类型是什么意思?)。
Kset会为挂在下面的kobject提供一些共有的属性文件,并且使用相同的热插拔函数。
1 | struct kset { |
kobject和kset是整个设备驱动模型的基石。
每个kobject对应sysfs中的一个目录,sysfs中的层次结构通过kobject之间的联系确定。
kobject最早是用来作为引用计数,用来跟踪被嵌入对象(参考kobject的使用方式)生命周期。
而随着kernel的不断升级,kobject承担的任务越来越多。
本系列主要介绍讨论Linux设备驱动模型,该模型是个非常复杂的系统。从上而下,其主要由总线、设备、驱动构成。从下而上,为了实现这些组件间的相互关系,定义了kobject以及kset两个底层的数据结构。以上两种底层数据结构和sysfs相交互,通过sysfs向用户空间展示了各个组件间的相互联系以及层次结构,并且以文件的形式向用户空间提供了简单访问内核的方法。
为了更容易理解Linux设备驱动模型,整个系列采用由下而上的方式进行分析。
书籍 | 状态 | 作者 | 时间 |
---|---|---|---|
深入理解Linux虚拟内存管理 | 在读 | 2016.5.25 | |
深入Linux设备驱动程序内核机制 | 在读 | 陈学松 | 2016.6.18 |
C和指针(POINTERS ON C) | 复习,完成 | Kenneth A. Reek | 2016.6.16 - 2016.6.18 |
书籍 | 状态 | 作者 | 时间 |
---|---|---|---|
白夜行 | 完成 | 东野圭吾 | 2016.4.20 |
重新定义团队 - Google如何工作 | 在读 | Laszlo Bock | 2016.7.3 |