linux内核模块编写与加载

本文记录了一位开发者在学习Linux内核模块编写与加载过程中的经验。从创建hello.c文件,编写Makefile,到解决因内核版本不匹配导致的编译问题,最终成功加载和卸载模块。文章强调了Makefile中Tab键的重要性,并提供了适用于Ubuntu和CentOS的编译及安装指令。通过这个实例,读者可以了解Linux内核模块的基本操作。
摘要由CSDN通过智能技术生成

前一段时间老师给我们布置了一个有关内核模块编写与加载的作业,有指导书,我看了一眼指导书,和往常一样,都是手把手教的那种。

  • 编写内核模块代码
  • 编写Makefile文件//注意是Makefile而不是makefile
  • 执行make命令
  • insmod装载模块
  • rmmod移除模块
    感觉好像和写一个C代码差不多
    但是等我把上面的代码复制过来运行时却频频报错,最后折腾了好久,原来是书上的例子太久远了,对于一些现在的内核已经不适用了,最后在网上找了大佬博客,借用一下代码,最后成功了,记录一下,供以后回顾。

原文链接
首先贴代码

先新建一个文件夹,保证Makefile和hello.c在同一文件夹下
hello.c

#include<linux/module.h>
#include<linux/init.h>                                                          
#include<linux/moduleparam.h>

MODULE_AUTHOR("Kevin Taylor");
MODULE_LICENSE("GPL");

static int nbr = 10; 
module_param(nbr, int, S_IRUGO);

static int __init hello_init(void)
{
   int i;
   printk(KERN_ALERT"Init hello mudule...\n");
   for(i=0;i<nbr;i++)
   {   
       printk(KERN_ALERT"Hello, how are you? %d\n", i); 
   }   
   return 0;
}
static void __exit hello_exit(void)
{
   printk(KERN_ALERT"Exit hello mudule...\n");
   printk(KERN_ALERT"I come from hello's module, I have been unload.\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_DESCRIPTION("A Simple Hello World");
MODULE_ALIAS("A simplest module");

Makefile

obj-m := hello.o #后面的hello是你要生成的模块的名字,可自行修改
CURRENT_PATH := $(shell pwd)
LINUX_KERNEL := $(shell uname -r)
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
all:
	$(MAKE) -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
	rm *.ko
	rm *.o

注意!!!

由于Makefile文件中命令行前需要有一个Tab键才能被识别,不然会出现Makefile missing separator. Stop.的错误
还有就是不同系统的Tab键的空格数是不同的,并且你可以设置这个值,如果你是直接复制代码的话建议先把命令前的空格全删了,然后自己重新输入Tab

在文件编写好并且保存之后,我们就可以在命令行输入make来编译了,make是linux下一个程序,如果你的电脑显示没有make的话可以通过sudo apt-get install build-essential命令来安装一些必须的程序

上面的命令适用于ubuntu,不同的系统命令会有所不同,例如cenOS就用yum 代替apt-get,根据自己的系统去网上找对应的下载命令。
然后会出现下面的情形,表示编译成功了
在这里插入图片描述
然后ls会发现多了很多文件,hello.ko (kernal object)内核目标文件

lsmod命令可以查看已经加载的模块
sudo insmod hello.ko命令将我们得到的模块加载进内核,然后用lsmod | grep hello就可以看到我们的模块已经可以在已装载模块中查询到了,接下来用dmesg命令,这个命令是查看日志,刚刚我们的模块实现的是在加载和卸载模块时往日志中写入,所以我们通过查看日志来检测模块功能是否实现。
在这里插入图片描述
毫无意外,我们确实往日志中写入了东西,那么我们接下来卸载模块,使用sudo rmmod hello注意没有.ko了
然后lsmod | hello,查询不到hello了,然后dmesg
在这里插入图片描述
这就实现了简单的模块加载与卸载。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Little BigUs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值