首先需要構建系統內核的源代碼樹,因為 模塊屬於kernel編程了,和用戶空間的c語言變成不同。他要依附於內核源碼樹的存在而存在。
內核模塊
一種機制能讓內核文件(zImage或bzImage)本身並不包含某組件,而是在該組件需要被使用的時候,動態地添加到正在運行的內核中Linux提供了一種叫做“內核模塊”的機制,就可以實現以上效果。
特點
•模塊本身並不被編譯進內核文件(zImage或者bzImage)
• 可以根據需求,在內核運行期間動態的安裝或卸載。
第一步,創建源代碼:hello.c
root@Ubuntu:/home/Mydocument/Modules#vi hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("fudan_abc");
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello, world!\n\n\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel workd!\n\n\n");
}
module_init(hello_init);
module_exit(hello_exit);
第二步,創建Makefile
root@ubuntu:/home/Mydocument/Modules#vi Makeile
obj-m += hello.o
all:
make -C /usr/src/linux-headers-$(shell uname -r) M=$(shell pwd) modules
clean:
make -C /usr/src/linux-headers-$(shell uname -r) M=$(shell pwd) clean
第三步,編譯
root@ubuntu:/home/Mydocument/Modules#make
root@ubuntu:/home/Mydocument/Modules#ls
hello.c hello.mod.o Module.symvers hello.ko
hello.o Makefile hello.mod.c modules.order
第四步, 安裝模塊
root@ubuntu:/home/Mydocument/Modules# insmod hello.ko
root@ubuntu:/home/Mydocument/Modules# lsmod
Module Size Used by
hello 12393 0
rfcomm 38408 0
bnep 17923 2
bluetooth 148839 10 rfcomm,bnep
parport_pc 32114 0
第五步, 查看輸出, 卸載模塊
root@ubuntu:/home/Mydocument/Modules#dmesg
[29665.689269] Hello, world!
root@ubuntu:/home/Mydocument/Modules# rmmod hello
root@ubuntu:/home/Mydocument/Modules# lsmod