The Linux Kernel Module Programming Guide簡譯(一)

來源:互聯網
上載者:User
轉載
The Linux Kernel Module Programming Guide簡譯(一)

sighofwraith 發表於 2005-6-12 17:35:19

How do modules get into the kernel?

 

首先,如果你想知道哪些模組已經載入,可以用一下lsmod,它會從/proc/modules中把你想看的東西讀出來。

模組是怎麼的載入的呢~~

當核心發現有一個功能,它需要,但是本來卻沒有,就會有一個叫kmod(老版本上它叫kerneld)的核心精靈程式運行modprobe去把相應的模組裝進來。Modprobe需要個參數來知道到底要作蝦米,這個參數可以有兩種形式:

·模組名,比方softdog或者ppp之類的東東。

·一個很一般化的描述符,比方char-major-10-30。

如果可憐的modprobe只搞到了一個相貌平平,扔到街上就找不到的蝦米描述符,它首先會去/etc/modules.conf找找這東西有沒有馬甲,比方如果找到下面這麼一行:

alias char-major-10-30 softdog

它就知道了,原來char-major-10-30對應的模組應該是softdog.o。

 

下一步,modprobe會去/lib/modules/version/modules.dep中找找載入這個模組之前是不是還有別的什麼要先裝進去。比方說要裝msdos.o之前就要先把fat.o裝進去。(modules.dep這個檔案是depmod –a建立的,提供依賴關係用)

 

最後,modprobe用insmod把這些需要裝的modules挨著裝進去。

 

Modprobe會告訴insmod模組們的標準目錄——/lib/modules/version/(如果你怕覆蓋掉原來的內容,可以在核心編譯的時候在Makefile裡改一下EXTRAVERSION)。Insmod是個需要制定模組所在位置的傢伙,而modprobe則有預設的位置可用。所以,比方說你想裝載msdos模組,你就要這麼寫:

insmod /lib/modules/2.5.1/kernel/fs/fat/fat.o

insmod /lib/modules/2.5.1/kernel/fs/msdos/msdos.o

或者光執行一個“modprobe –a msdos”。

 

Linux發行版都提供了modprobe、insmod、depmod,它們打成了一個叫modutils或者mod-utils的包。

 

結束這段內容之前,我們先從/etc/modules.conf弄個片斷來看看:

# This file is automatically generated by update-modules

path[misc]=/lib/modules/2.4.?/local

keep

path[net]=~p/mymodules

options mydriver irq=10

alias eth0 eepro

# 開頭的行是注釋。

path[misc]這行告訴modprobe找misc模組的時候把預設的目錄換成/lib/modules/2.4.?/local。

path[net]這行告訴modprobe找net模組的時候在~p/modules目錄找,但是前面的“keep”則告訴modprobe是把這個新的目錄加進原來的搜尋目錄,而不是向對misc那樣替換掉。

alias這行是說kmod見到eth0這個描述符的時候裝載eepro.o這個模組(聲明馬甲!)。

 

呵呵,現在大家知道模組是怎麼載入的了。不過如果你想寫一個依賴於其他的模組的模組還是有點問題的,不過這個比較“進階”的問題容後再說啦~~:)

 

1.2.1 Before we begin

研究代碼之前,先介紹一點小tip。畢竟大家的系統多少都有點差別,而且每個人的習慣也不一樣,所以即便是簡簡單單的一個“hello world”有時候可能也會變成麻煩。所以先看看下面這些在動手還是比較有用的。

 

1.2.1.1 Modversioning

除非你使能了核心中的CONFIG_MODVERSION,否則針對一個核心編譯的模組是不能載入進其他版本系統的。我們現在不去深入到modules versioning。在我們加上modversion內容之前,如果你運行在一個開啟了modversioning的系統上,這裡的例子可能不能正常工作。不過,大部分的linux發行版都是開啟了這個開關的。如果你因為版本錯誤不能載入模組,那你可以試試編譯一個關上modversioning的。

1.2.1.2 Using x

這裡強烈推薦你自己輸入、編譯、載入所有的例子。也強烈建議你在console下做這些事情,而不是在X下面。

在console上,模組會把log資訊和警告之類的東西直接顯示出來。而在X下的xterm裡insmod載入一個模組,這些資訊會被記錄下來,但不在xterm上顯示。這樣顯得比較麻煩一點。所以推薦使用console。

1.2.1.3 Compiling issues and kernel version

linux發行版往往發布一個使用各種不標準方法補丁過的核心給你,這可能會帶來很多麻煩。

一個很常見的問題就是,一些linux發行版的核心和它給你的標頭檔不完全一樣。所以最好自己下載核心code安裝上(其實。。。這主意也很麻煩的說。。。。如果只是gcc預設的標頭檔版本不對,那就自己找對應版本的核心code用-I開關選正確的include來編譯吧。)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.