概述
一个linux内核模块实际不需要多少关键点,内核提供kernel编译路径可以快速编译。内核提供module模块以及命令能够快速作为一个插件插入内核中。
关键点是__init和 __exit将代码编译后放入不同的代码段,然后insmod加载到对应地址,使用module_init和module_exit挂载insmod和rmmod需要用到的symbol进行运行。
特此记录一个简单的module模块,方便以后快速拷贝和运行
C
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/list.h>
static int __init my_init_module(void)
{
printk("hello world\n");
return 0;
}
static void __exit my_exit_module(void)
{
printk("goodbye world\n");
}
module_init(my_init_module);
module_exit(my_exit_module);
Makefile
obj-m := test.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.c *.symvers *.order
编译
make
# make
make -C /lib/modules/4.15.0-163-generic/build M=/root/workspace modules
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-163-generic'
CC [M] /root/workspace/test.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: modpost: missing MODULE_LICENSE() in /root/workspace/test.o
see include/linux/module.h for more information
CC /root/workspace/test.mod.o
LD [M] /root/workspace/test.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-163-generic'
运行
加载
insmod test.ko
日志:
#dmesg -c
[1004368.795436] hello world
删除
rmmod test.ko
日志:
#dmesg -c
[1004377.383554] goodbye world
# 综述
C关键点:
static int __init my_init_module(void)
static void __exit my_exit_module(void)
module_init(my_init_module);
module_exit(my_exit_module);
Makefile关键点:
obj-m := test.o
KDIR := /lib/modules/$(shell uname -r)/build
$(MAKE) -C $(KDIR) M=$(PWD) modules
附件:参考资源列表