【发布时间】:2017-02-18 09:49:35
【问题描述】:
谁能解释一下 linux char 驱动程序所涉及的接口以及提供它的相应组件?
【问题讨论】:
标签: c linux linux-device-driver
谁能解释一下 linux char 驱动程序所涉及的接口以及提供它的相应组件?
【问题讨论】:
标签: c linux linux-device-driver
首先,您需要头文件linux/fs.h,其中声明了文件系统的函数。这是必需的,因为字符驱动程序管理对字符设备的访问,该字符设备通常表示为/dev 中的文件。
如果您在 /dev 中运行 ls -l,您会看到如下几行:
crw-rw----. 1 root lp 6, 0 14. Feb 18:23 lp0
crw-rw----. 1 root lp 6, 1 14. Feb 18:23 lp1
crw-rw----. 1 root lp 6, 2 14. Feb 18:23 lp2
crw-rw----. 1 root lp 6, 3 14. Feb 18:23 lp3
crw-rw-rw-. 1 root tty 5, 0 15. Feb 10:57 tty
crw--w----. 1 root tty 4, 0 14. Feb 18:23 tty0
行首的c 表示字符设备文件。这些是文件系统中的节点,您可以通过驱动程序与这些节点进行通信。日期前的两个数字表示用于该设备的驱动程序。例如,lp0 有数字 6 和 0。第一个数字称为major,第二个称为minor。内核使用主编号为该设备选择正确的驱动程序。在/proc/devices 中,您可以找到这个数字的内核模块名称、实际驱动程序。第二个数字仅供驱动程序使用,以便可以使用一个驱动程序管理多个设备。比如上面的lp0-3使用了所有主号为6的驱动。
注册驱动程序并在/dev/devices 中生成条目的古老而简单的方法是调用以下函数。
int register_chrdev(unsigned int major, const char *name,
const struct file_operations *fops)
major 是驱动程序的主编号,name 是出现在/dev/devices 中的名称,fops 是指向包含驱动程序所有功能的跳转表的指针。这是通过结构file_operations 实现的。您必须在内核的fe.h 中查找此结构以了解支持的功能。比您在驱动程序中定义此结构并输入驱动程序的函数名称和驱动程序不支持的函数为 NULL。对于 NULL 条目,然后使用一些默认值。使用C tagged structure initialization syntax更舒服。最重要的功能是lseek、read和write。该设备由file 结构表示,该结构也在linux/fs.h 中定义。
在较新的代码中,使用linux/cdev.h 中的cdev 结构而不是上述函数。
对于这种方式和驱动程序编程的更多细节,我推荐这个:http://www.oreilly.com/openbook/linuxdrive3/book/ch03.pdf。
如果您有已编译的驱动程序,您可以使用insmod 将其加载到内核中。如果您想使用modprobe,请查看它在系统上的配置方式,因为它不同。要为设备获取/dev 中的节点,请使用mknod。对于主编号 10 和次编号 0 的字符设备,它看起来像这样:
mknod /dev/my_device c 10 0
【讨论】: