[linux內核編程入門].1.1.構建自己的內核模塊

http://linux.chinaunix.net/techdoc/beginner/2009/04/12/1107495.shtml

[linux內核編程入門].1.1.構建自己的內核模塊

 
 
 
[內核編程入門]構建自己的內核模塊
雖然Linux是個宏內核系統,但是內核允許在運行時動態地加載或卸載模塊。這項特性爲Linux內核開發與使用帶來了很多方便,比如基本內核映像可以做得足夠小,新功能和驅動程序可以以模塊的形式提供。同時,這樣做也方便調試。本文中將描述如何構造一個最簡單的內核模塊。
1. 編寫一個簡單的內核模塊
模塊文件中需要有入口點和出口點,這是加載與卸載模塊時要被調用的。這兩個接口在include/linux/init.h定義,相當於模塊的“構造”與“析構”函數:
module_init(init_func);
module_exit(exit_func);
其中,init_func與exit_func分別在模塊被加載和卸載時調用,可以在這裏執行初始化與清理工作。
在include/linux/module.h文件中,給出了一系列模塊相關的接口,包括:
MODULE_LICENSE 聲明版權
MODULE_AUTHOR 聲明作者
MODULE_DESCRIPTION 給出模塊的描述
等等
那麼,我們可以給出一個最簡單的模塊:
#include
#include
#include
int init_hello()
{
        printk(KERN_INFO "Hello, world!/n");
        return 0;
}
void exit_hello()
{
        printk(KERN_INFO "Goodbye, world!/n");
}
module_init(init_hello);
module_exit(exit_hello);
2. 如何編譯執行這個模塊呢?
2.6的內核採用了"kbuild"構建系統。一般情況下,有兩種方法來構造一個模塊,一是直接放在內核源碼樹裏,另外一個則是直接以模塊形式發佈
(1) 放入內核源碼樹
> 在源碼子目錄中,創建自己的目錄,比如
# mkdir net/ipv4/hello
然後把源碼hello.c放入其中。
> 修改該目錄下的Makefile
# vim net/ipv4/Makefile
添加一行
obj-m += hello/
> 如果這個模塊是需要有配置選項開啓的,比如CONFIG_MY_HELLO,則還需要加入
obj-$(CONFIG_MY_HELLO) += hello/
> 最後,在hello目錄下,添加自己的Makefile,一行搞定:
# vim net/ipv4/hello/Makefile
obj-m += hello.o
(2) 單獨發佈,放在內核代碼外
在自己的源碼樹目錄下,可以編寫這樣的Makefile
obj-m := hello.o
如果有多個文件,可以這樣寫:
obj-m := hello.o
hello-objs := hello-main.o hello-world.o
那麼接下來,需要告訴make如何找到內核源碼樹和其他的Makefile
# make -C <kernel source path SUBDIRS=$PWD modules即可。
如下爲一個簡單的Makefile樣例:
ifneq ($(KERNELRELEASE),)
obj-m  := hello.o
else
        KERNELSRC :=/lib/modules/$(shell uname -r)/build
        PWD :=$(shell pwd)
modules :  
        make -C $(KERNELSRC) SUBDIRS=$(PWD) $@
clean:
        rm -f *.o *.ko
endif
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章