單一模塊編譯,想象兩個情況:
如果我的預設核心忘記加入某個功能,而且該功能可以編譯成為模塊,不過, 預設核心卻也沒有將該項功能編譯成為模塊,害我不能使用時,該如何是好?
如果Linux 核心原始碼並沒有某個硬件的驅動程序 (module) ,但是開發該硬件的廠商有提供給 Linux 使用的驅動程序原始碼,那麼我又該如何將該項功能編進核心模塊呢?
很有趣對吧!不過,在這樣的情況下其實沒有什麼好說的,反正就是去取得原始碼後,重新編譯成為系統可以加載的模塊啊!很簡單,對吧! 但是,上面那兩種情況的模塊編譯行為是不太一樣的,不過,都是需要 make, gcc 以及核心所提供的 include 標頭檔與函式庫等等。
硬件開發商提供的額外模塊:
很多時候,可能由於核心預設的核心驅動模塊所提供的功能您不滿意, 或者是硬件開發商所提供的核心模塊具有更強大的功能, 又或者該硬件是新的,所以預設的核心並沒有該硬件的驅動模塊時,那您只好自行由硬件開發商處取得驅動模塊, 然後自行編譯啰!
如果您的硬件開發商有提供驅動程序的話,那麼真的很好解決,直接下載該原始碼,重新編譯, 將他放置到核心模塊該放置的地方後,呵呵!就能夠使用了!舉例來說,如果您不想使用核心原本提供的 Intel 網絡卡模塊,而想使用 Intel 官方釋出的最新模塊,例如下面這個例子:
模塊說明與下載:http: //downloadfinder.intel.com/ ... l/Detail_Desc.ASPx? agr=Y&Inst=Yes&ProdUCtID=993&DwnldID=2896&strOSs=39&OSFullName=Linux*〈=eng
您可以利用各種方法將他下載後,假設這個檔案放置到 /root ,那麼直接將他解壓縮吧! 之後就可以讀一讀 INSTALL/README ,然後找一下 Makefile ,就能夠編譯了。整體流程有點像這樣:
1. 將檔案解壓縮:
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /root/e100-3.4.14.tar.gz
[root@linux src]# cd e100-3.4.14
2. 開始進行編譯與安裝:
[root@linux e100-3.4.14]# vi README <==注意查一下該檔案內容
[root@linux e100-3.4.14]# cd src
[root@linux src]# make
# 此時您會看到出現如下這一行:
# make[1]: Entering Directory `/usr/src/kernels/2.6.13-1.1532_FC4-i686'
# 這代表這個驅動程序在編譯時,會去讀取的核心原始碼 include file
# 的目錄所在!有興趣的朋友,務必查閱一下 Makefile 啦!
[root@linux src]# ls -l
-rw-r--r-- 1 root root 77908 Jul 2 08:24 e100.c
-rw-r--r-- 1 root root 351351 Dec 5 00:48 e100.ko
-rw-r--r-- 1 root root 4775 Dec 5 00:48 e100.mod.c
-rw-r--r-- 1 root root 39684 Dec 5 00:48 e100.mod.o
-rw-r--r-- 1 root root 312564 Dec 5 00:48 e100.o
-rw-r--r-- 1 root root 21092 Jul 2 08:24 ethtool.c
-rw-r--r-- 1 root root 43258 Jul 2 08:24 kcompat.h
-rw-r--r-- 1 root root 9610 Jul 2 08:24 Makefile
3. 開始將該模塊移動到核心目錄,並且更新模塊相依屬性!
[root@linux src]# cp e100.ko \
> /lib/modules/`uname -r`/kernel/drivers/net
[root@linux src]# cd /lib/modules/`uname -r`
[root@linux 2.6.13-1.1532_FC4]# depmod -a
有趣吧!透過這樣的動作,我們就可以輕易的將模塊編譯起來,並且還可以將他直接放置到核心模塊目錄中, 同時以depmod 將模塊建立相關性,未來就能夠利用modprobe 來直接取用啦!^_^ 但是需要提醒您的是,當自行編譯模塊時, 若您的核心有更新 (例如利用自動更新機制進行線上更新) 時,則您必須要重新編譯該模塊一次,重復上面的步驟!才行!因為這個模塊僅針對目前的核心來編譯的啊!對吧!
利用舊有的核心原始碼進行編譯:
舉個例子來說,目前FC4 的核心就是 2.6 版,而且也有 NTFS 的原始碼,只不過, FC4 就是沒有將這個模塊給他編譯起來!那我能否使用目前的核心原始碼進行NTFS 檔案系統的模塊編譯呢?當然可以啊!不過,我是否需要整個核心編譯的過程從頭來一次呢?
我們首先到目前的核心原始碼所在目錄下達 make menuconfig , 然後將 NTFS 的選項設定成為模塊,之後直接下達:
make fs/ntfs/
那麼ntfs 的模塊就會自動的被編譯出來了!可惜的是,預設的 FC4 核心原始碼並沒有附上所有的程序代碼, 僅有提供相關的 Makefile 檔案而已,傷腦筋~ 因此,您僅能以我們剛剛才建立的 /usr/src/linux-2.6.14.2 這個目錄, 直接下達 make fs/ntfs 來建立起 ntfs.ko 這個模塊~然後將該模塊復制到 /lib/modules/2.6.14.2/kernel/fs/ntsf/ 目錄下, 再去到 /lib/modules/2.6.14.2 底下執行 depmod -a ,呵呵~ 就可以在原來的核心底下新增某個想要加入的模塊功能啰。
核心模塊管理: lsmod, modinfo, modprobe, insmod, rmmod...
核心與核心模塊是分不開的,至於驅動程序模塊在編譯的時候,更與核心的原始碼功能分不開~ 因此,您必須要先了解到:核心、核心模塊、驅動程序模塊、核心原始碼與標頭檔案的相關性,然後才有辦法了解到為何編譯驅動程序的時候老是需要找到核心的原始碼才能夠順利編譯!然後也才會知道,為何當核心更新之後,自己之前所編譯的核心模塊會失效~
此外,與核心模塊有相關的,還有那個很常被使用的 modprobe 指令,以及開機的時候會讀取到的模塊定義數據文件 /etc/modprobe.conf ,這些資料您也必須要了解才行~相關的指令說明我們已經在開機流程與 loader 文章內談過了, 您應該要自行前往了解。