在上一篇中,我们编译了自己的主线内核,建议读者在source insight中建立内核源码工程。现在我们开始学习第一个内核模块,有一个初步的感性认识。
驱动程序在Linux内核里扮演着特殊的角色,它们就像“黑盒子”, 操作底层硬件而定义好的内部接口,它们完全隐藏了设备工作的细节。用户的活动通过一套标准化的调用来进行;设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关的操作上。
Hello World内核模块:
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk(KERN_ALERT "hello_init!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "hello exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("LiJunnan");
这个模块中定义了两个函数,其中一个在模块被装载到内核时调用(hello_init),另一个则在模块被卸载时调用(hello_exit)。module_init()和module_exit()使用了内核的特殊宏来定义,特殊宏MODULE_LICENSE用来告诉内核该模块采用自由许可证,如果没有内核会不高兴。
printk是用在linux内核打印信息时用,和用户空间标准C库的printf功能类型。字符串KERN_ALERT定义了这条消息的优先级,显示的指定优先级是为了能在控制台上看到,注意在KERN_ALERT后面不能加逗号。具体更多细节,将在后续章节中说明,在此,大家先彼此见个面,认识一下。
然后编写Makefile,只是为了测试,在此,提供一个简单的Makefile样例
obj-m := hello_module.o
KDIR:= /lib/modules/$(shell uname -r)/build
all:
make -C $(KDIR) M=$(PWD) modules cc=gcc-5
clean:
make -C $(KDIR) M=$(PWD) modules clean
rm -f modules.order
接下来在terminal中键入make命令,就会生成.一堆文件,其中包括.ko文件,即模块
最后,我们通过insmod和rmmod工具来测试这个模块,注意需要使用超级用户权限才能加载和卸载模块。
sudo insmod hello_module.ko
sudo rmmod hello_module
分别执行完以上两条指令,我们可以用cat /var/log/syslog查看结果
第一个内核模块就算完成了,这是我的学习小结,内容不多,供大家参考,也可以自行拓展学习,加深理解,有的朋友会在这个过程遇到一些小问题,可多查找资料解决。