模块是什么?
引用《linux内核设计与实现》的话。
尽管Linux是“单独内核”的操作系统——这是说整个系统内核都运行于一个单独的保护域中,但是Linux内核是模块化组成 ,它允许内核在运行时动态地向其中插入或从中删除代码。这些代码(包括相关的子例程、数据、函数入口和函数出口)被一并组合在一个单独的二进制镜像中,即所谓的可装载内核模块中,或简称模块
书写内核hello module模块
目的:在内核/linux-2.6.36.2/drivers/目录下创建一个test文件夹,里面添加hello module模块
以下为需要添加的内容
第一步:
drivers/Makefile
添加:
obj-$(CONFIG_TEST) += test/
编译包含test目录
CONFIG_TEST为m表示编译为模块,y表示编译到内核,否则不编译
drivers/Kconfig
source "drivers/test/Kconfig"
将test下的Kconfig包含,当make menuconfig时可以设置TEST_MODEL选项
第二步:
mkdir drivers/test/
touch Kconfig Makefile test.c
test.c内容
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/module.h>
static int __init hello_init(void)
{
printk("Hello module!\n");
return 0;
}
static void __exit hello_cleanup(void)
{
printk("Exit module!\n");
}
module_init(hello_init);
module_exit(hello_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("W.xy");
MODULE_DESCRIPTION("Hello module");
hello_init函数是模块的入口点,它通过module_init例程注册到系统中,在内核装载时被调用。hello_exit函数是模块的出口函数,它由module_exit例程注册到系统。在模块从内存卸载时,内核便会调用hello_exit。
MODULE_LICENSE:标准
MODULE_AUTHOR:作者信息
MODULE_DESCRIPTION:模块的简单说明
Kconfig
config TEST
tristate TEST_MODEL
help
this is test model
Kconfig中的config TEST与Makefile中的CONFIG_TEST对应
选择M表示编译为模块,对应内核下的.confg中CONFIG_TEST=m
Makefile
obj-$(CONFIG_TEST) += test.o
/* when TEST_MODEL choose M ,CONFIG_TEST=m */
obj-$(m) += test.o
然后编译内核,会出现test.ko文件
第三步:
测试
insmod test.ko
打印 Hello module!
rmmod test.ko
打印
Exit module!