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 |
[linux內核編程入門].1.1.構建自己的內核模塊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.