![Linux内核如何知道设备的主设备号和次设备号?](https://linux22.com/image/96102/Linux%E5%86%85%E6%A0%B8%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E8%AE%BE%E5%A4%87%E7%9A%84%E4%B8%BB%E8%AE%BE%E5%A4%87%E5%8F%B7%E5%92%8C%E6%AC%A1%E8%AE%BE%E5%A4%87%E5%8F%B7%EF%BC%9F.png)
据我所知,内核检测硬件,向sysfs添加信息,在/dev中创建设备,然后生成udev事件。我的问题是,设备驱动程序执行所有这些操作还是内核本身执行所有这些操作?如果驱动程序这样做,那么他们就会知道设备的主设备号和次设备号,以便在 devtmps 中创建文件。
我还理解(也许是错误的)是 udev 调用 modprobe 来加载处理设备的驱动程序。
有人告诉我,他们使用 MODALIAS uevent 环境变量的内容来执行此操作,从而加载别名与该字符串匹配的所有模块(正确的驱动程序)。简而言之:Linux 中硬件检测的步骤是什么以及谁执行每个步骤:内核本身、内核内的驱动程序或用户空间中的 udev。谢谢。
答案1
内核知道设备号,因为它决定设备号。每个驱动程序都会注册其管理的设备号。这些数字要么硬编码在源代码中,要么在某些情况下动态分配。这系统文件系统文件系统允许 udev 等应用程序发现内核支持的设备。看udev 如何获取它创建的设备的设备号?更多细节。
驱动程序的初始化代码探测硬件,并根据探测期间发现的硬件来注册设备。某些类型的硬件不支持探测;例如,ISA总线(PC 型计算机上的一种基本上过时的总线)无法列出连接的硬件,因此驱动程序只能尝试通信并祈祷同一地址上没有连接不同的外设。在某些平台上,引导加载程序包括设备树描述可用的外设及其映射位置,Linux 内核根据此信息激活驱动程序。可以通过三种方式为外设加载驱动程序。
- 驱动程序可以作为内核映像的一部分包含在内。
- 驱动程序可以被编译为模块,并显式加载(例如,通过将其包含在
/etc/modules
initramfs 中或 initramfs 中)。 - 有一种机制可以根据总线类型报告的信息自动加载某些驱动程序,这些总线类型可以列出连接的外围设备以及通用标识号,例如 PCI(现代 PC 中的主总线)和 USB。内核运行
modprobe
并向其传递一个符号名称,该符号名称对外设的标识进行编码,这是驱动程序模块的“真实”名称的别名。看驱动模块是否自动加载和卸载?