這個學期,開始接觸linux核心,覺得其linux核心的實現機制確實挺有趣的,我個人比較喜歡模組這種設計方式,感覺其極大的擴充了核心,感覺就像是window程式中的動態連結程式庫一樣,只有當需要的時候,才會載入進來。
就和人與人之間第一次接觸一樣,和核心開始打交道,首先還是相互問好(當然,核心跟我們問好,就回饋在它能乖乖的聽我的話,把資訊正確地輸出)。程式很簡單,就是在進入核心的時候,列印一個Hello Kernel,離開的時候,再說聲See you, Kernel。這個程式基本上是按照陳莉君老師的核心之旅網站上的教程依樣畫葫蘆,非常感謝陳老師的引導以及作者寫的這麼好的教程。
1 #include<linux/module.h>
2 #include<linux/kernel.h>
3 #include<linux/init.h>
4
5 static int __init hello_init(void)
6 {
7 printk("<1>Hello Kernel!\n"); /*立即輸出資訊*/
8 return 0;
9 }
10
11 static void __exit hello_cleanup(void)
12 {
13 printk("<1>See you,Kernel!\n");
14 }
15
16 module_init(hello_init); /*進入核心的時候,調用hello_init */
17 module_exit(hello_cleanup); /*離開核心的時候,調用hello_cleanup */
18 MODULE_LICENSE("GPL"); /*協議*/
19
再接著看看Makefile檔案的編寫,這個是至關重要的,我第一次沒寫對,所以編譯的時候出問題拉,我一開始還以為是我自己有上面必須的組建沒裝,後來在同學的指導下並參考核心之旅網站上的內容,才弄好拉這個Makefile,還請您多多指點。
1 obj-m += hello.o #由此目標檔案產生模組
2 CURRENT_PATH := $(shell pwd) #當前所在的路徑
3 LINUX_KERNEL := $(shell uname -r) #核心的版本號碼
4
5 #核心代碼所在的路徑
6 LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
7
8 #編譯
9 all:
10 make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
11
12 #清除編譯產生的檔案
13 clean:
14 make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
然後,編譯檔案:
make
再接著,插入模組到核心(insert module):
sudo insmod hello.ko
然後看看核心編譯輸出的資訊:
dmesg
我的機子上顯示的是:
[ 6848.544940] Hello Kernel!
然後卸載模組(remove module):
sudo rmmod hello.ko
再一次查看核心輸出資訊:
dmesg
我的機子輸出是:
[ 7076.558033] See you,Kernel!
這樣,我的第一次模組編程就完成了。希望您能多多提出寶貴的意見,比如說怎麼樣學習核心編程比較好,先謝謝拉。