首先需要构建系统内核的源代码树,因为 模块属于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