write 的奥秘 在Linux 下我们在使用设备的时候,都会用到write 这个函数,通过这个函数我们可以象使用文件那样向设备传送数据
可是为什么用户使用write 函数就可以把数据写到设备里面 去,这个过程到底是怎么实现的呢
这个奥秘就在于设备驱动程序的write 实现中,这里我结合一些源代码来解释如何使得一个简简单单的write 函数能够完成向设备里面写数据的复杂过程
这里的源代码主要来自两个地方
第一是 oreilly 出版的《Linux device driver》中的 实例,第二是 Linux Kernel 2
14 核心源代码
我只列出了其中相关部分的内容,如果 读者有兴趣,也可以查阅其它源代码
不过我不是在讲解如何编写设备驱动程序,所以不 会对每一个细节都进行说明,再说有些地方我觉得自己还没有吃透
由于《Linux device driver》一书中的例子对于我们还是复杂了一些,我将其中的一个 例程简化了一下
这个驱动程序支持这样一个设备:核心空间中的一个长度为 10 的数组 kbuf[10]
我们可以通过用户程序 open 它,read 它,write 它,close 它
这个设备的名 字我称为 short_t
现在言归正传
对于一个设备,它可以在/dev 下面存在一个对应的逻辑设备节点,这个节点以文件的形式 存在,但它不是普通意义上的文件,它是设备文件,更确切的说,它是设备节点
这个节 点是通过mknod 命令建立的,其中指定了主设备号和次设备号
主设备号表明了某一类设 备,一般对应着确定的驱动程序;次设备号一般是区分是标明不同属性,例如不同的使用 方法,不同的位置,不同的操作
这个设备号是从/proc/devices 文件中获得的,所以一 般是先有驱动程序在内核中,才有设备节点在目录中
这个设备号(特指主设备号)的主 要作用,就是声明设备