linux字符驱动程序中的接口

时间:2017-02-18 09:49:36

标签: c linux linux-device-driver

任何人都可以解释一下linux char驱动程序所涉及的接口以及提供它的相应组件吗?

1 个答案:

答案 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的数字为60。第一个数字称为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会更舒服。最重要的功能是lseekreadwrite。设备由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