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

问题描述:

我想知道这是第一次启动和后续的靴子。Linux内核如何知道在启动时加载哪些驱动程序?

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

TIA。

+3

猜测这对于http://unix.stackexchange.com会是一个更好的问题。 – ziesemer

+0

http://doc.opensuse.org/documentation/html/openSUSE_113/opensuse-reference/cha.udev.html – firo

Greg Kroah给出了一个很好的例子,说明如何准确找到您需要的内核驱动程序。请格雷格给他的书掉在网上免费

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

引自格雷格的书籍

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. 
+0

感谢您的回答阿德里安。我实际上正在通读本书的第7章。 Greg Kroah详细介绍了发现正在运行的内核当前加载哪些模块的过程 - 这非常有价值。我很好奇的是OS如何知道首先加载这些模块? – izzy

+0

ASAIK一般的蛮力 - 它试图加载它 - 如果它不工作,硬件可能不存在。 –

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

内核为例如设备上的设备生成事件。 PCI总线插入时(热或冷;事件排队,直到用户空间运行AFAIR)。 udev将接收这些事件并执行modprobe调用,其中包括设备的PID/VID(产品/供应商ID);这通常是一个带有一些*的字符串。然后modprobe将计算由udev的加载请求通配符和内核模块别名集合(它们本身可能是通配符)表示的集合的交集。由于USB /火线/等等。控制器通常连接到PCI总线,这就是您的HCI驱动程序如何加载。这就是事物缓解的方式;然后使用USB/Firewire PID/VID进行加载。

然而,网络协议模块(例如ipv6)不通过udev处理;相反,当一个程序调用socket(AF_INET6, ...)时,由于AF_INET6碰巧具有值10,所以内核直接调用modprobe(更确切地说,是/proc/sys/kernel/modprobe中的任何值),net-pf-10(在IPv6的情况下)。modprobe然后加载ipv6.ko,因为那是net-pf-10别名是什么。

与文件系统类似,尝试mount -t foo将导致内核也调用modprobe(同样通过____call_usermodehelper),这次使用foo作为参数。

如果尚未加载loop.ko,则访问设备节点(例如/dev/loop0,如果它已存在)具有相同的策略。此处的内核请求block-major-7-0(因为loop0通常具有(7,0),参见ls -l),并且loop.ko具有拟合block-major-7-*别名。

+0

没有像模块那样的文件。syms,它列出了在启动时加载的设备? – brokenfoot