参考 https://blog.sourcerer.io/writing-a-simple-linux-kernel-module-d9dc3762c234
编码 C文件书写 首先,先书写一个C文件,命名为kernel_first.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> MODULE_LICENSE("GPL" ); MODULE_AUTHOR("Robert W. Oliver II" ); MODULE_DESCRIPTION("A simple example Linux module." ); MODULE_VERSION("0.01" ); static int __initexample_init(void ) { printk(KERN_INFO "Hello, World!\n" ); return 0 ; } static void __exitexample_exit(void ) { printk(KERN_INFO "Goodbye, World!\n" ); } module_init(example_init); module_exit(example_exit);
请注意使用printk而不是printf。 另外,printk与printf共享的参数不同。 例如,KERN_INFO是一个标志,用于声明应为此行设置日志记录的优先级,并且不带逗号。 内核在printk函数中对此进行了分类,以节省堆栈内存。
在文件末尾,我们调用module_init和module_exit告诉内核哪些函数是在load时候执行,那些在unload的时候执行
Makefile书写 1 2 3 4 5 obj-m += kernel_first.o all: make -C /lib/modules/$(shell uname -r) /build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r) /build M=$(PWD) clean
注 make前面应该是Tab键
测试 执行如下命令加载模块到内核sudo insmod kernel_first.ko执行dmesg|grep -i hello,将会看到Hello world的输出。接下来卸载内核模块sudo rmmod kernel_first,接下来运行dmesg,你将会看到Goodbye world的输出