linux内核如何知道设备的主次号?

mmm*_*mmm 5 drivers udev linux-kernel

据我所知,内核检测硬件,将信息添加到 sysfs 在 /dev 中创建一个设备,然后生成一个 udev 事件。我的问题是,设备驱动程序是做所有这些还是内核本身?如果驱动程序这样做,那么他们将知道设备主要和次要编号以在 devtmps 中创建文件。

我也明白(可能是错误的)是 udev 调用 modprobe 来加载处理设备的驱动程序。

有人告诉我,他们使用 MODALIAS uevent 环境变量的内容来执行此操作,从而加载别名与此字符串匹配的所有模块(正确的驱动程序)。简而言之:linux中硬件检测的步骤是什么,谁执行每一步:内核本身,内核内部的驱动程序或用户空间中的udev。谢谢。

Gil*_*il' 6

内核知道设备号,因为它决定了设备号。每个驱动程序注册它管理的设备号。这些数字要么在源代码中硬编码,要么在某些情况下动态分配。该sysfs的文件系统允许应用程序如udev的发现内核支持的设备。请参阅udev 如何获取它创建的设备的设备编号?更多细节。

驱动程序的初始化代码探测硬件,并根据探测期间发现的硬件注册设备。某些类型的硬件不支持探测;例如,ISA 总线(PC 类型计算机上的一种很大程度上过时的总线)无法列出连接的硬件,因此驱动程序只能尝试通信并祈祷在同一地址上没有连接不同的外设。在某些平台上,引导加载程序包含一个描述可用外设及其映射位置的设备树,Linux 内核会根据此信息激活驱动程序。可以通过三种方式为外围设备加载驱动程序。

  • 驱动程序可以作为内核映像的一部分包含在内。
  • 驱动程序可以编译为一个模块,并显式加载(例如,通过将其包含/etc/modules在 initramfs中或在 initramfs 中)。
  • 有一种机制可以根据总线类型报告的信息自动加载某些驱动程序,这些信息可以列出连接的外围设备以及通用标识号,例如 PCI(现代 PC 中的主总线)和 USB。内核运行modprobe并向它传递一个符号名称,该名称对外围设备的标识进行编码,这是驱动程序模块“真实”名称的别名。请参阅驱动程序模块是否自动加载和卸载?