2014-05-26 LDD閱讀筆記-在ubuntu裡編寫helloworld模組
關於特定的核心樹問題
核心模組的編譯需要核心樹,也就是一個核心原始碼以及編譯最簡單編譯之後的所有檔案(包括.so檔案)。在ubuntu系統編譯核心模組,需要用ubuntu系統的核心樹,即使下載同樣核心編號然後編譯,可以進行正確編譯,但是載入時會出現錯誤:
#insmod hello.ko
Error inserting ‘./hello.ko’ :-1 Invalid module format
因為Ubuntu的核心是一個打了很多補丁的特定核心。
在網上有許多關於構建核心樹的方法,如果使用構建的核心樹取代原系統的核心,應該不會出現以上的錯誤,但是可能會引起其他的系統的錯誤。
在之前的學習中,嘗試過在開發板執行
下面介紹在ubuntu12.10裡構建helloworld模組
在ubuntu12.10
系統本來就有一個核心樹:
原始碼:
Hello.c
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT"hello\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT"goodbye\n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
obj-m := hello.o
KERNELDIR ?=/lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules //注意開頭的是Tab鍵
[email protected]
[email protected]:~/ldd/hello$ sudo rmmod ./hello.ko
在帶有視窗的linux系統,沒有輸出,輸出在/var/log/syslog上
Apr 24 17:20:09 ming kernel: [ 8374.198677] hello
Apr 24 17:20:23 ming kernel: [ 8387.975696] goodbye
下面是構建一個核心樹的方法,但是沒有取代原來系統的核心
****************************分界線***********************************
[email protected]:~#apt-cache search linux-source
[email protected]:~#apt-get install linux-source-3.2.0
下載完成後,在/usr/src下,檔名為:linux-source-2.6.32.tar.bz2,是一個壓縮包,然後用 命令解壓即可獲得Linux核心的原始碼: [email protected]:/usr/src#tar jxvf linux-source-2.6.32.tar.bz2
(2)然後在Linux核心原始碼目錄/usr/src/linux-source-2.6.32目錄下面用老的方法配置好Linux核心: [email protected]:/usr/src/linux-source-2.6.32#make oldconfig
(3)然後執行: [email protected]:/usr/src/linux-source-2.6.32#make bzImage 這個過程大概需要一個小時左右。。。執行完成後會在當前目錄下面生成一個檔案vmlinux.o
(4)然後編譯模組: [email protected]:/usr/src/linux-source-2.6.32#make modules 這個過程又是大概一個小時。。。
(5)然後便可以安裝模組了: [email protected]:/usr/src/linux-source-2.6.32#make modules_install 這個過程大概兩分鐘:
以上步驟完成以後,會在/lib/modules目錄下面生成一個資料夾 linux-2.6.32-24-generic,至此你差不多已經成了,因為你已經構造好了核心樹!!! 下面開始在自己的工程資料夾下面建立兩個檔案: hello.c(不用說了) Makefile(它需要能夠找到核心樹,然後將目標模組連結上去):
注意裡面各種變數的顏色額~有興趣的讀者可以自己去研究一下這個檔案,裡面唯一和hello.c相關的部分就是 obj-m := hello.o 那一行了!第5行表明了核心樹build目錄的位置。 下面在當前目錄下面執行 [email protected]:/usr/jiq/DriverProject#make 生成以下檔案
轉載於:https://blog.51cto.com/caidoushu/1417252