你好linux内核-如何向linux内核添加一个hello模块

如何向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 内核 ,再见

猜你喜欢

转载自blog.csdn.net/qq_32783703/article/details/109348448
今日推荐