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

izz*_*zzy 13 linux kernel module

我想知道第一次启动和后续启动时的情况.

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

TIA.

jør*_*sen 12

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

当插入时,内核为例如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别名.

类似地,对于文件系统,尝试mount -t foo将导致内核也调用modprobe(再次,通过____call_usermodehelper),这次使用fooas参数.

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


Adr*_*ish 5

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. 
Run Code Online (Sandbox Code Playgroud)