Linux内核如何知道在引导时要加载的驱动程序?

我想知道这是为了第一次启动和随后的靴子.

我正在编译我自己的内核,并希望它尽可能的精简.我想手动构建.config文件(主要作为一个学习体验),所以我需要知道可以排除的所有内容.我知道一个可能的解决方案是查看我目前的加载驱动程序的发行列表.但是,我很好奇我的发行版最初发现了什么驱动程序.

TIA.

最佳答案

How does the Linux kernel know which drivers to load at boot?

内核生成例如设备的事件. PCI总线插入(热或冷;事件排队等待用户空间运行AFAIR). udev将接收这些事件并进行modprobe调用,其中包括设备的PID / VID(产品/供应商ID);这通常是一个带有一些*的字符串. modprobe然后计算由udev的加载请求通配符表示的集合和内核模块的别名集合(它们本身可能是通配符).

由于USB / Firewire等.控制器通常连接到PCI总线,这就是您的HCI驱动程序的加载方式.这就是事情的复发;当然,加载USB / Firewire PID / VID.

然而,网络协议模块(例如ipv6)不通过udev处理;相反,当程序调用socket(AF_INET6,…)时,内核直接使用非通配符的别名调用modprobe(更准确地说:/ proc / sys / kernel / modprobe中的任何内容),net-pf-10在IPv6,因为AF_INET6恰好具有值10. modprobe然后加载ipv6.ko,因为这是net-pf-10的别名.

类似地,对于文件系统,尝试安装-t foo将使内核也可以调用modprobe(再次,通过____call_usermodehelper),这次使用foo作为参数.

如果loop.ko尚未加载,则访问设备节点(例如/ dev / loop0,只要它已经存在)具有相同的策略.这里的内核要求block-major-7-0(因为loop0通常有(7,0),参见ls -l),而loop.ko具有拟合块 – 大7-bit的别名.

转载注明原文:Linux内核如何知道在引导时要加载的驱动程序? - 代码日志