本文是基於2.6的核心,也建議各位可以先看一下《Linux核心設計與實現第二版)》作為一個基礎知識的鋪墊。當然,從實踐角度來看,只要按著以下的步驟去做也應該可以實現成功編譯核心及載入模組。
個人用的Linux版本為:Debian GNU/Linux,核心版本為:2.6.20-1-686.
◆第一步,下載Linux核心的原始碼,即構建LDD3Linux Device Drivers 3rd)上面所說的核心樹。
如過安裝的Linux系統中已經內建了原始碼的話,應該在/usr/src目錄下。如果該目錄為空白的話,則需要自己手動下載原始碼。下載代碼的方法和連結很多,也可以在CU上通過http://download.chinaunix.net/search/?key=&q=kernel&frmid=53去下載。不過,下載的核心版本最好和所啟動並執行Linux系統的核心版本一致。當然,也可以比Linux系統核心的版本低,但高的話應該不行個人尚未實踐)。
Debian下可以很方便的通過Debian源下載:
首先尋找一下可下載的核心原始碼:
# apt-cache search linux-source
其中顯示的有:linux-source-2.6.20,沒有和我的核心版本完全符合,不過也沒關係,直接下載就可以了:
# apt-get install linux-source-2.6.20
下載完成後,安裝在/usr/src下,檔案名稱為:linux-source-2.6.20.tar.bz2,是一個壓縮包,解壓縮既可以得到整個核心的原始碼:
# tar jxvf linux-source-2.6.20.tar.bz2
解壓後產生一個新的目錄/usr/src/linux——source-2.6.20,所有的原始碼都在該目錄下。
註:該目錄會因核心版本的不同而不同,各位動手實踐的朋友只需知道自己的原始碼所在的具體位置即可。
◆第二步:配置及編譯核心。
進入/usr/src/linux——source-2.6.20目錄下,可以看到Makefile檔案,它包含了整個核心樹編譯資訊。該檔案最上面四行是關於核心版本的資訊。對於整個Makefile可以不用做修改,採用預設的就可以了。
一般情況下,需要先用命令諸如"make menuconfig", "make xconfig"或者"make oldcofig"對核心進行配置,這幾個都是對核心進行配置的命令,只是它們啟動並執行環境不一樣,執行一下這幾個命令中的任何一個即可對核心進行配置:
make menuconfig是基於介面的核心配置方法,make xconfig應該是基於QT庫的,還有make gcofig也是基於圖形的配置方法,應該是需要GTK的環境,make oldcofig就是對核心樹原有的.config檔案進行配置一下即可。
其實核心的配置部分,主要是保證核心啟動模組可動態載入的配置,預設配置裡面應該已經包含了這樣的內容,因此,我用的是make oldconfig.
在核心源碼的目錄下執行:
# make
# make bzImage
其中,第一個make也可以不執行,直接make bzImage。這個過程可能要持續一個小時左右,因此是對整個核心重新編譯了。執行結束後,可以看到在目前的目錄下產生了一個新的檔案: vmlinux, 其屬性為-rwxr-xr-x。
然後執行:
# make modules
# make modules_install
對核心的所有模組進行編譯和安裝。
執行結束之後,會在/lib/modules下產生新的目錄/lib/modules/2.6.20/。 在隨後的編譯模組檔案時,要用到這個路徑下的build目錄。至此,核心編譯完成。可以重啟一下系統。
◆第三步:編寫模組檔案及Makefile
以LDD3上的hello.c為例:
//hello.c#include <linux/init.h>#include <linux/module.h>MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){ printk(KERN_ALERT "Hello, world\n"); return 0;}static void hello_exit(void){ printk(KERN_ALERT"Goodbye, cruel world\n");}module_init(hello_init);module_exit(hello_exit); |
Makefile檔案的內容為:
obj-m := hello.oKERNELDIR := /lib/modules/2.6.20/buildPWD := $(shell pwd)modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_installclean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions |
其中,hello.c和Makefile檔案應該位於同一個目錄下,可以放在/home下,我的兩個檔案都位於/home/david/.