第一个内核模块程序编译

本文介绍了一个简单的Linux内核模块的创建过程,包括源代码编写、Makefile配置、模块编译及加载方法。通过具体步骤展示了如何利用 printk() 函数在内核中输出信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.创建内核模块源文件hello_printk

代码如下:

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

static int __init
hello_init(void)
{
printk("Hello, world!\n");
return 0;
}
module_init(hello_init);
static void __exit
hello_exit(void)
{
printk("Goodbye, world!\n");
}
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Valerie Henson <val@nmt.edu>");
MODULE_DESCRIPTION("\"Hello, world!\" minimal module");
MODULE_VERSION("printk");

1.创建Makefile文件

代码如下:
obj-m := hello_printk.o  #obj-m 意思是将后面跟的东东编译成内核模块。相对应还有:obj-y 编译进内核,obj-n 不编译
KDIR  := /lib/modules/$(shell uname -r)/build  #指定到已经编译的内核的目录
PWD   := $(shell pwd)  #指定源文件目录
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules

3.现在,开始编译和运行代码。转到相应的目录下,编译内核模块

cd  hello_printk
make
编译成功结果如下:
此时,目录下多了一些.o或者.ko文件(如下图),没编译之前,只有源文件和Makefile文件,这是编译的结果。

接着,装载内核模块,使用insmod指令,并且通过dmesg来检查打印出的信息,dmesg是打印内核消息缓存的程序。
sudo insmod ./hello_printk.ko
如果装载内核模块后,内核中有相同名字的内核模块。

此时,如果我们是调试程序,这个模块不是必要的,可以用rmmod命令将模块卸载了,还可以采用
将模块相关的c代码文件名改掉,更新Makefile中的 obj-m += xxx.o,在重新编译装载。
$ dmesg | tail(dmesg | tail -2表示打印两行)

你将从dmesg的屏幕输出中看见”Hello world!”信息。现在卸载使用rmmod卸载内核模块,并检查退出信息。

sudo rmmod hello_printk
$ dmesg | tail

其实,我们在载入模块时,还可以用工具modprobe载入指定模块,这个工具提供模块依赖性分析,错误智能检查,错误报告以及许多其他功能和选项,建议使用这个命令。但是在运用改命令前,要使用depmod命令生成依赖性息。不然会出现not found情况:

depmod后,然后执行depmod /home/yiyi/Desktop/hello_printk13/hello_printk.ko,可以正确装载内核模块(注意要绝对路径)。如下图:

到此,你就成功地完成了对内核模块的编译和安装!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值