任何人都可以解释一下linux char驱动程序所涉及的接口以及提供它的相应组件吗?
答案 0 :(得分:1)
首先,您需要头文件linux/fs.h
,其中声明了文件系统的函数。这是必需的,因为字符驱动程序管理对字符设备的访问,该字符设备通常表示为/dev
中的文件。
如果您在ls -l
中运行/dev
,则会看到如下所示的行:
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,第二个称为major。内核使用主要编号为该设备选择正确的驱动程序。在/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