谁能解释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
具有数字6
和0
。第一个数字称为专业,第二个称为次要。内核使用主号码为该设备选择正确的驱动程序。在其中,/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条目,则使用一些默认值。更舒适的是它使用ç标记结构初始化语法。最重要的功能是lseek
,read
和write
。在那里,设备也由中file
定义的结构表示linux/fs.h
。
在较新的代码中,使用cdev
struct 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] 删除。
我来说两句