gpt4 book ai didi

linux - 主号次号和驱动加载

转载 作者:IT王子 更新时间:2023-10-29 00:46:56 25 4
gpt4 key购买 nike

我是初学者。我对与设备驱动程序相关的主要编号和次要编号有所了解。我也知道大多数可以插入 Linux 系统的设备都有一个主编号。并根据这个主编号,加载相应的驱动程序。我有这个疑问,请告诉我插入时内核如何从设备读取主设备号?请尽可能简单地解释从设备插件到驱动程序加载的步骤。

提前致谢。

最佳答案

主要/次要数字用于 block 字符设备。

您不会检测来自设备的主要号码。也许您认为 USB 设备可以传递设备编号,而 Linux 使用这些设备编号,但 USB 供应商/产品 ID 与主要编号无关。如果将一个完全无用的串行设备插入串行端口会怎样?内核无法知道您插入/拔出了某些东西。

因此,例如,如果您想要字符设备的主编号,您可以使用

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);

如 NKamrath 所说,或者您使用绝对值。但是请注意,many are reserved .

据我所知,这是您要求的步骤:

  1. 您将一些 block /字符设备插入到一些总线
  2. 根据总线(USB、PCI、PCI Express、SCSI、I²C 等),总线(可能)发送一个中断信号,该信号有一天或另一天到达 CPU 并且因此到 Linux。
  3. 中断例程做必要的工作,了解总线类型及其内部机制,为这个设备加载适当的驱动程序(如果它存在,并且肯定存在)并执行它的初始化功能。
  4. 设备驱动程序的初始化函数注册(例如 register_chrdev_region)一个主编号,如果它保留了一个主编号(参见这个著名的 reserved list );否则它要求内核为它分配一个(例如 alloc_chrdev_region);驱动程序还将为此驱动程序保留一个次要区域。
  5. 驱动程序设置一些回调(打开/关闭/读/写)并要求内核将它们与设备号相关联。

此时,您可以使用驱动程序的设备号与驱动程序通信,但是如何呢? /dev 中还没有任何内容……一种方法是在知道要与之通信的主要/次要对时使用 mknod。你会发出:

# mknod /dev/mydevice c 232 4

... 即:请在 /dev/mydevice 创建一个设备节点,它链接到字符 (c) 设备,主设备为 232,辅设备为 4。但是那你怎么知道这些数字呢?它们可能是绝对的(保留列表),也可能是驱动程序 printk 提供的,因此您可以手动执行。

但这里有更好的东西。

还是在设备驱动的初始化函数中:驱动将设备注册为Sysfs设备(参见 device_create)。这会将设备放入 /sys 树中,它的节点(一个目录)将有一个名为 uevent 的文件。如果你 cat 它,它会输出类似的东西

MAJOR=232
MINOR=4
DEVNAME=whatever

试一试:

$ cat /sys/class/tty/console/uevent

是否匹配

$ ls -l /dev/console

?

现在,udev是负责管理/dev的用户空间程序。总的来说,它只是扫描 /sys 树以自动填充 /dev。您还可以像这样看到所有主要/次要字符和 block 设备:

$ ls /sys/dev/char
$ ls /sys/dev/block

就是这样。如果您想更好地理解这一切,请开发一个虚拟驱动程序并尝试使其自动出现在 /dev 中。

关于linux - 主号次号和驱动加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11162960/

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