linux字符驱动程序中的接口

贾维斯

谁能解释linux char驱动程序及其提供的相应组件所涉及的接口?

马里

首先,您需要头文件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第一个数字称为专业,第二个称为次要。内核使用主号码为该设备选择正确的驱动程序。在其中,/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是指向具有驱动程序所有功能的跳转表的指针。这是通过struct实现的file_operations您必须在fe.h内核的中查找此结构才能了解支持的功能。比在驱动程序中定义此结构,然后输入驱动程序的函数名称,并为驱动程序不支持的函数输入NULL。对于NULL条目,则使用一些默认值。更舒适的是它使用ç标记结构初始化语法。最重要的功能是lseekreadwrite在那里,设备也由中file定义结构表示linux/fs.h

在较新的代码中,使用cdevstruct inlinux/cdev.h代替了上面的函数。对于这种方式以及驱动程序编程的更多详细信息,我建议这样做:http : //www.oreilly.com/openbook/linuxdrive3/book/ch03.pdf

如果您拥有编译的驱动程序,则可以将其加载insmod到内核​​中。如果要使用modprobe它,请检查它在系统上的配置方式,因为它有所不同。要获得设备的节点,/dev可以使用mknod对于具有主要编号10和次要编号的字符设备,0其外观如下所示:

mknod /dev/my_device c 10 0 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章