简单内核模块编写
可查看内核源代码中的说明:linux-src/Documentation/kbuild/modules.txt
模块编写
hellomod.c
:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE("Dual BSD/GPL");
static int __init hellomod_init(void)
{
printk("Hello, World!\n");
return 0;
}
static void __exit hellomod_exit(void)
{
printk("Goodbye, World!\n");
}
module_init(hellomod_init);
module_exit(hellomod_exit);
-
所有模块必须包含 module.h
-
kernel.h 包含了常用的内核函数
-
init.h 包含了宏
__init
和__exit
宏,它们允许释放内核占用的内存 -
printf() 函数由内核定义,功能和 printf() 类似,它把信息输出到终端或系统日志
-
module_init()
, 这是驱动程序初始化的入口点。 对于内置模块,内核在引导时调用该入口点; 对于可加载模块则在该模块插入内核时才调用 -
module_exit
, 对于可加载模块,内核在此处调用module_cleanup()
函数, 而对于内置的模块,它什么都不做
模块编译与运行
编写 Makefile 文件如下:
MODNAME = hellomod
obj-m := $(MODNAME).o
KDIR := /lib/modules/`uname -r`/build
MDIR := /lib/modules/`uname -r`/extra
# 编译模块
all:
make -C $(KDIR) M=$(PWD) modules
# 安装模块
install:
cp $(MODNAME).ko $(MDIR)
depmod -a
# 卸载模块
uninstall:
rm $(MDIR)/$(MODNAME).ko
# 清理文件
clean:
make -C $(KDIR) M=$(PWD) clean
-
编译模块
make
-
安装模块
sudo make install
-
载入模块
sudo modprobe hellomod
-
查看打印的 "Hello, World!\n"
dmesg
-
移除模块
sudo rmmod hellomod
或者
sudo modprobe -r hellomod
-
查看打印的 "Goodbye, World!\n"
dmesg
-
卸载模块
sudo make uninstall
-
清理文件
make clean