1. 程式人生 > 實用技巧 >2014-05-26 LDD閱讀筆記-在ubuntu裡編寫helloworld模組

2014-05-26 LDD閱讀筆記-在ubuntu裡編寫helloworld模組

關於特定的核心樹問題

核心模組的編譯需要核心樹,也就是一個核心原始碼以及編譯最簡單編譯之後的所有檔案(包括.so檔案)。在ubuntu系統編譯核心模組,需要用ubuntu系統的核心樹,即使下載同樣核心編號然後編譯,可以進行正確編譯,但是載入時會出現錯誤:

#insmod hello.ko

Error inserting ‘./hello.ko’ :-1 Invalid module format

因為Ubuntu的核心是一個打了很多補丁的特定核心。

在網上有許多關於構建核心樹的方法,如果使用構建的核心樹取代原系統的核心,應該不會出現以上的錯誤,但是可能會引起其他的系統的錯誤。

在之前的學習中,嘗試過在開發板執行

helloworld模組不會出現錯誤,是因為燒寫進開發板的核心樹與編譯核心模組的核心樹是一樣的。

下面介紹在ubuntu12.10裡構建helloworld模組

ubuntu12.10

系統本來就有一個核心樹:

clip_image002[4]

原始碼:

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]

:~/ldd/hello$ sudo insmod ./hello.ko

[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