Linux構建代碼樹
1. 查看本Linux內核版本
在shell界面上使用“uname -a”命令即可查出內核版本。如下圖:
2. 下載內核源碼
在shell界面執行命令:apt-get install linux-source-內核版本號
下載完成後,在/usr/src/下會有一個源代碼壓縮包,如上執行命令,會生成linux-source-內核版本號.tar.bz2文件。
如上圖的版本號則執行:apt-get install linux-source-2.6.32,下載完成後在/usr/src/下會有一個源代碼壓縮包linux-source-2.6.32.tar.bz2文件。
3. 到/usr/src/下,解壓壓縮包:
tar jxvf linux-source-2內核版本號.tar.bz2,完成後會生成名爲“linux-source-版本號”的文件夾,所有源碼都在裏面。
4. 現在開始編譯內核了,編譯需要很多時間:
到/usr/src/下的代碼目錄中,執行命令:
#編譯配置文件
make oldconfig
#開始編譯
make #也可以不用這一步
make bzImage #注意,此處“I”爲大寫的“I”
#執行完上面這三個命令,可以看到在當前目錄下生成了一個新的文件: vmlinux, 其屬性爲-rwxr-xr-x。
make modules
make modules_install
執行結束之後,會在/lib/modules下生成新的目錄/lib/modules/2內核版本號/。 在隨後的編譯模塊文件時,要用到這個路徑下的build目錄。至此,內核編譯完成。
Linux內核驅動編譯的方法
1. 編譯內核程序需要的條件:在linux上構建好源碼樹以及寫好內核源代碼;此方法測試於內核版本爲2.6.32的Linux系統上。
2. 在與程序源代碼相同的目錄下創建Makefile文件,Makefile文件並非完全如下,具體的是看程序源代碼如何寫,一般的內核程序源代碼的Makefile文件的內容可如下:
obj-m :=程序源代碼名.o
KERNELDIR:= /lib/modules/2.6.20/build
PWD :=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD)modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD)modules_install
3. 在shell界面上執行命令:
make -C /lib/modules/2.6.32/build M=程序源代碼所在文件夾的路徑
執行此命令便開始編譯內核代碼了
4. 執行編譯好了的內核程序
必須用root權限:insmod ./程序源代碼名.ko
代碼的輸出:如果不出現在終端則會寫進 /var/log/syslog文件中。
附: 簡單的Linux驅動程序
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("DualBSD/GPL");
static inthello_init(void)
{
printk(KERN_ALERT "Hello,world\n");
return 0;
}
static voidhello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruelworld\n");
}
module_init(hello_init);
module_exit(hello_exit);