我的第一個內核模塊和makefile文件編寫

      相信很多做過內核編程的人都寫過makefile,雖然之前寫過一些簡單的內核模塊寫過makefile,到今天想要寫一個內核模塊的時候發現之前學的的已經全部忘記了。而且之前寫的時候也沒有寫一些博客什麼的記錄下來。Orz….
      言歸正傳,Makefile這個文件還是真的不好寫。相信你跟我一樣之前編程的時候爲了圖好看的代碼風格,敲了很多很多的空格,基本上逢符號必空格。今天在寫makefile時候,寫完了,一make,各種錯誤彈出來。頓時知道真相的我眼淚掉下來,而且這個錯誤還跟我們寫c程序錯誤不一樣,基本上都是一些什麼什麼文件錯誤,什麼什麼文件不存在了。
先貼出來我的makefile。

#makefile file                                                                                                                                         
obj-m := kernelhello.o
CURRENT_PATH:=$(shell pwd)
LINUX_KERNEL:=$(shell uname -r)
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)

all:
        make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
        make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
再看看我的.c文件
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>


static int __init lkp_init(void)
{

        printk("<1>hello world! from the kernel space...\n");
        return 0;
}

static void __exit lkp_cleanup( void )
{
        printk("<2>Goodbye world! from the kernel space...\n");
}

module_init(lkp_init);
module_exit(lkp_cleanup);
MODULE_LICENSE("GPL");
~                      

make以後

      經過多方查找資料,得出的結論就是M=XXX的=號後邊不要寫空格不要寫空格不要寫空格(重要的事說三邊)!!!!M前面一定要打上空格,因爲M之前是linux kernel的絕對路徑,如果沒有空格的話系統會直接把等號前面都看成是kernel的絕對路徑(而實際上的絕對路徑是比這個少一個最後的M字母的),of couse這個路徑是錯誤的,沒辦法找到的。
      如果 obj-m := kernelhello.o中的obj-m的-兩端寫上了空格,則make完了以後只有 modules.order Module.symvers這兩個文件,其他的沒有。
      最後終於make出來了一個kernelhello.ko文件,(從這裏開始操作都要是超級用戶)用insmod kernelhello.ko命令插入模塊,用lsmod命令可以查找模塊是否已經插入到內核中去。最後用dmesg打印出buffer中的信息,最後一行就可以看見自己寫的hello。移除模塊的命令是rmmod kernelhello。
      模塊常用的宏:
MODULE_AUTHOR(“”); 模塊作者
MODULE_DESCRIPTION(“”); 模塊描述
MODULE_ALIAS(“”); 模塊別名
      __init和__exit是屬性 —— 聯結到函數(或者變量)的元數據片。屬性在用戶空間的C代碼中是很罕見的,但是內核中卻很普遍。所有標記爲__init的,會在初始化後釋放內存以供重用(還記得那條過去內核的那條“Freeing unused kernel memory…[釋放未使用的內核內存……]”信息嗎?)。__exit表明,當代碼被靜態構建進內核時,該函數可以安全地優化了,不需要清理收尾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章