Linux Device Drivers ─ Hello World 模組範例
Hello World 範例模組
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_INFO "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
通常都可以在根目錄底下的/usr/src 中找到kernel tree,或是自行到官網去下載與本身使用的系統相符的Kernel Tree,可以透過uname –r 來看kernel 版本號。
由上圖可以看到Ubuntu8.04現在使用的kernel是2.6.24-23-generic。
所以我們可以到kernel tree( linux-headers-2.6.24-23-generic )去建立hello world範例模組。
建立Hello 資料夾,並且在hello資料夾中建立Makefile與hello.c檔
Makefile內容如下:
obj-m := hello.o
只需這一行即可。
hello.c只需要依照上面的範例即可。
開始編譯:
make -C /usr/src/linux-headers-2.6.24-23-generic/ M=' /usr/src/linux-headers-2.6.24-23-generic/hello' modules
C 後面的路徑代表 kernel tree的位置
M 後面的路徑代表 Module 位置
編譯完成產生如下的檔案,要裝載的驅動只有hello.ko。
裝載驅動與卸載驅動:
如果你從一個終端模擬器或者在視窗系統中運行 insmod 和 rmmod, 你不會在你的螢幕上看到任何東西. 訊息會進入其中一個系統日誌檔中,(通常在 /var/log/messages,隨系統而異)。
因為是使用終端模擬器所以在上圖中看不到任何的訊息,故可以到/var/log/messages中去找尋剛剛裝載與卸載的資訊。
cat /var/log/messages
Messages的訊息量很大,但最新的訊息卻是出現在最後,所以用cat就可以看到他最後的訊息是否為我們剛剛裝載與卸載的資訊。

您好, 請問一下: 您的方法當 hello.c 在 kernel tree之下,可以正常 compile, 並測試 ok,我將 hello.c, Makefile 移到我的home目錄下, 重新compile則 fail,請問是否有哪個步驟出錯?是否 include path還是 lib 找不到? make command 如下,該如何修改? root@ubuntu:/home/cc/workspace/device1/src#make -C /usr/src/linux-headers-2.6.31-19-generic/ M='/home/cc/workspace/device1/src' modules Error message 如下: ... /home/cc/workspace/device1/src/device1.c: 16: error: expected ',' or ':' before static' /home/cc/workspace/device1/src/device1.c: In function '__inittest': ... ...
您好: 我以經解決此問題,方法相同,是我的 source code有點改到,anyway謝謝您的 blog對初學者幫助很大.
能夠給別人幫助,我也是感到很高興。這幾天要過年了,放假中@@,所以現在才回應。
感謝分享~~~ 測試成功^^