linux 字符驱动程序中的接口
Interfaces in a linux character driver
谁能解释一下 linux 字符驱动程序和提供它的相应组件所涉及的接口?
首先,您需要头文件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
。第一个数字称为大调,第二个称为小调。内核使用主编号来为该设备选择正确的驱动程序。在 /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
是指向跳转的指针 table 具有驱动程序的所有功能。这是通过结构 file_operations
实现的。您必须在内核的 fe.h
中查找此结构才能了解支持的功能。比你在你的驱动程序中定义这个结构并输入你的驱动程序的函数名称和 NULL 对于你的驱动程序不支持的函数。对于 NULL 条目,将使用一些默认值。使用C tagged structure initialization syntax更方便table。最重要的功能是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
谁能解释一下 linux 字符驱动程序和提供它的相应组件所涉及的接口?
首先,您需要头文件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
。第一个数字称为大调,第二个称为小调。内核使用主编号来为该设备选择正确的驱动程序。在 /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
是指向跳转的指针 table 具有驱动程序的所有功能。这是通过结构 file_operations
实现的。您必须在内核的 fe.h
中查找此结构才能了解支持的功能。比你在你的驱动程序中定义这个结构并输入你的驱动程序的函数名称和 NULL 对于你的驱动程序不支持的函数。对于 NULL 条目,将使用一些默认值。使用C tagged structure initialization syntax更方便table。最重要的功能是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