Linux内核如何知道在启动时加载哪些驱动程序?

时间:2011-12-12 03:49:05

标签: linux module kernel

我想知道第一次开机和后来的靴子。

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

TIA。

2 个答案:

答案 0 :(得分:12)

  

Linux内核如何知道在启动时加载哪些驱动程序?

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

自USB / Firewire /等。控制器通常连接到PCI总线,这就是你的HCI驱动程序加载的方式。这就是事情的重演方式;然后使用USB / Firewire PID / VID进行加载。

然而,网络协议模块(例如ipv6)不通过udev处理;相反,当一个程序调用{​​{1}}时,内核直接调用modprobe(更确切地说:socket(AF_INET6, ...)中的任何内容),带有非通配别名,如果是IPv6则为/proc/sys/kernel/modprobe,因为{{1}碰巧有值10. modprobe然后加载net-pf-10,因为这是AF_INET6别名。

同样对于文件系统,尝试ipv6.ko将导致内核也调用modprobe(再次通过net-pf-10),这次使用mount -t foo作为参数。

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

答案 1 :(得分:4)

Greg Kroah就如何准确找到内核所需的驱动程序提供了一个很好的例子。亲切的格雷格在线免费提供他的书

http://files.kroah.com/lkn/

Greg的书中引用

I'm especially proud of the chapter on how to figure out how to configure
a custom kernel based on the hardware running on your machine. This is an
essential task for anyone wanting to wring out the best possible speed and
control of your hardware.