2011-12-12 105 views
12

我想知道這是第一次啓動和後續的靴子。Linux內核如何知道在啓動時加載哪些驅動程序?

我正在編譯我自己的內核,並希望它儘可能地精益。我想手動構建.config文件(主要是作爲一種學習體驗),所以我需要知道可以排除的所有內容。我知道一個可能的解決方案是查看我當前的加載驅動程序的發行清單。不過,我很好奇我的發行版如何發現最初加載的驅動程序。

TIA。

+3

猜測這對於http://unix.stackexchange.com會是一個更好的問題。 – ziesemer

+0

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

回答

3

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一般的蠻力 - 它試圖加載它 - 如果它不工作,硬件可能不存在。 –

12

如何在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

相關問題