gpt4 book ai didi

c - linux 字符驱动程序中的接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:26 28 4
gpt4 key购买 nike

谁能解释一下 linux char 驱动程序和提供它的相应组件所涉及的接口(interface)?

最佳答案

首先,你需要头文件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 有数字 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/devicesfops 中的名称 是指向包含驱动程序所有功能的跳转表的指针。这是通过结构 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 

关于c - linux 字符驱动程序中的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42313597/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com