如何向linux内核中添加第一个helloword模块
怀着激动的心情,彻夜难眠,向linux内核中添加了第一个hello_kernel模块,算是我对linux内核的第一次打招呼吧,你好kernel
由于linux内核驱动中,第一章节并没有对如何加载内核有十分详细的说明,这里学习自网址
https://blog.csdn.net/wait_for_taht_day5/article/details/50404572
linux 内核官方下载地址
https://www.kernel.org
这是linux内核的官网
我的测试环境是一台ubuntu虚拟机,如果你重新编译linux内核需要注意了,内核大约编译20G,历经两小时,幸运的是ubuntu里面有内核代码树,我们免去了编译这个流程,因为我们看到内核树就在我的狄电脑上的
首先
ls /lib/modules
我看到了电脑上有好多关于linux内核的发行版本
zhanglei@zhanglei-virtual-machine:~$ ls /lib/modules/5.4.0-
5.4.0-26-generic/ 5.4.0-37-generic/ 5.4.0-40-generic/ 5.4.0-45-generic/
5.4.0-33-generic/ 5.4.0-39-generic/ 5.4.0-42-generic/ 5.4.0-47-generic/
这里我有了疑惑,我应该选择哪一个目录呢?
uname -r
给了你答案
内核树就在 /lib/modules/5.4.0-47-generic/build 下面
好了我们开始编写代码了,我们要向linux内核上挂载模块,只需要写一个hello_kernel.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static __init int hello_init(void)
{
printk(KERN_ALERT "HELLO,KERNEL\n");
return 0;
}
static __exit void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, Kernel!\n");
}
module_init(hello_init);
module_exit(hello_exit);
对核心的挂载函数只有两个
module_init(hello_init);
module_exit(hello_exit);
这里要有一个说明printk是在内核中定义的,功能和printf类似,但是不能好像不能格式化浮点型,因为内核在运行的时候不依赖任何外部的c库,模块可以调用printk,是因为在insmod函数载入后,模块就连接到了内核,当然可以调用这个函数了(引子linux设备驱动)。
我们在需要写一个make file
obj-m:=hello_kernel.o
KERNELBUILD := /lib/modules/$(shell uname -r)/build
default:
make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
rm -rf *.o *.ko
obj-m表示把文件test.o作为"模块"进行编译,不会编译到内核,但是会生成一个独立的 "test.ko" 文件
我们可以看到hello_kernel.ko这个内核模块
好了最后我们加载模块跟内核打招呼吧!!
zhanglei@zhanglei-virtual-machine:~$ sudo insmod hello_kernel.ko && tail -f /var/log/kern.log
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.644488] hello_kernel: module license 'unspecified' taints kernel.
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.644489] Disabling lock debugging due to kernel taint
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.644602] hello_kernel: module verification failed: signature and/or required key missing - tainting kernel
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.646193] HELLO, lingyun IoT Studio!
Oct 28 23:44:54 zhanglei-virtual-machine kernel: [ 2401.079667] Goodbye, I have found a good job!
Oct 28 23:45:22 zhanglei-virtual-machine kernel: [ 2428.281660] HELLO, lingyun IoT Studio!
Oct 28 23:45:34 zhanglei-virtual-machine kernel: [ 2440.247857] Goodbye, I have found a good job!
Oct 28 23:45:46 zhanglei-virtual-machine kernel: [ 2453.022348] HELLO, lingyun IoT Studio!
Oct 28 23:45:56 zhanglei-virtual-machine kernel: [ 2462.435602] Goodbye, I have found a good job!
Oct 28 23:56:02 zhanglei-virtual-machine kernel: [ 3068.900484] HELLO,KERNEL
好了我们看到了我们跟内核打招呼了
我们再对内核说再见吧
zhanglei@zhanglei-virtual-machine:~$ sudo rmmod hello_kernel.ko && tail -f /var/log/kern.log
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.644489] Disabling lock debugging due to kernel taint
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.644602] hello_kernel: module verification failed: signature and/or required key missing - tainting kernel
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.646193] HELLO, lingyun IoT Studio!
Oct 28 23:44:54 zhanglei-virtual-machine kernel: [ 2401.079667] Goodbye, I have found a good job!
Oct 28 23:45:22 zhanglei-virtual-machine kernel: [ 2428.281660] HELLO, lingyun IoT Studio!
Oct 28 23:45:34 zhanglei-virtual-machine kernel: [ 2440.247857] Goodbye, I have found a good job!
Oct 28 23:45:46 zhanglei-virtual-machine kernel: [ 2453.022348] HELLO, lingyun IoT Studio!
Oct 28 23:45:56 zhanglei-virtual-machine kernel: [ 2462.435602] Goodbye, I have found a good job!
Oct 28 23:56:02 zhanglei-virtual-machine kernel: [ 3068.900484] HELLO,KERNEL
Oct 28 23:56:47 zhanglei-virtual-machine kernel: [ 3113.694009] Goodbye, Kernel!
^C
zhanglei@zhanglei-virtual-machine:~$
自此 我们完成了第一次跟内核的相见,hello linux 内核 ,再见