linux module的编写方法

本文介绍了一个简单的Linux模块编程示例,包括必要的头文件引入、模块的初始化与清除函数定义及Makefile配置。通过具体代码展示了如何实现加载时输出“Hello World!”及卸载时的提示。

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

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

MODULE_LICENSE("GPL");                //协议声明
MODULE_AUTHOR("David Xie");            //作者
MODULE_DESCRIPTION("Hello World Module");    //模块描述
MODULE_ALIAS("a simplest module");        //声明别名

static int __init hello_init()
{
    printk(KERN_EMERG"Hello World!\n");
    return 0;
}

static void __exit hello_exit()
{
    printk("<6>hello exit\n");
}
module_init(hello_init);    //声明模块初始化函数
module_exit(hello_exit);    //声明模块清理函数

#include <linux/module.h>是必须添加的

#include <linux/init.h>在某些情况不需要添加,但建议添加;这里包括printk的优先级声明和module_init module_exit的声明。
测试话函数static int __init hello_init()可以任意名字的,因为有nodule_init()来处理,同样退出函数也可以是任意名字的。

__init声明这个函数在模块初始化完成后释放该函数并回收内存

__exit还没有真正的意思

printk函数和我们常常用的printf不太一样的,printk是用在内核里的,并且具有优先级的,共8个(0~7),printk函数一般不会打印在终端中,而是记录到文件里,作为日记
供查询。

ifneq ($(KERNELRELEASE),)

obj-m := hello.o

else
    
KDIR := /lib/modules/2.6.18-53.el5/build
all:
    make -C $(KDIR) M=$(PWD) modules
clean:
    rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif


这个Makefile文件也不太一样,这是基于一种叫kbuild来写的。

2.6.18-53.el5这个是内核的版本,在/lib/modules/文件夹下,这个要改成你本机对应的版本。

obj-m := hello.o:这个要根据你的需要修改。

这样我们就可以使用make了
最后得到hello.ko
使用sudo insmod hello.ko就安装上了,使用lsmod可以查看,使用rmmod hello就可以卸载了


### 关于Linux内核模块开发与故障排除 #### Linux内核模块的基础概念 Linux内核模块是一种动态加载到运行中的内核中的代码片段,用于扩展内核的功能而不需重新编译整个内核。这些模块可以提供设备驱动程序、文件系统支持或其他功能[^2]。 当UEFI安全启动被启用时,Linux内核可能会禁止使用UIO(Userspace I/O),因此建议将DPDK使用的设备绑定到`vfio-pci`内核模块而不是任何基于UIO的模块[^1]。这有助于确保系统的安全性以及兼容性。 #### 开发流程概述 编写一个简单的内核模块通常涉及以下几个方面: - **初始化函数**:定义模块加载时执行的操作。 - **清理函数**:指定卸载模块时要完成的任务。 - 使用宏`module_init()`注册初始化函数,用`module_exit()`声明退出函数。 下面是一个基本的例子展示如何创建一个最基础的hello world类型的内核模块: ```c #include <linux/module.h> /* 所有模块都需要 */ #include <linux/kernel.h> /* KERN_INFO 宏 */ static int __init hello_start(void){ printk(KERN_INFO "Loading Hello module...\n"); return 0; // 非零返回表示失败,模块无法加载 } static void __exit hello_end(void){ printk(KERN_INFO "Goodbye Mr.\n"); } module_init(hello_start); module_exit(hello_end); MODULE_LICENSE("GPL"); // 设置许可证为GPL ``` #### 常见问题排查方法 如果遇到错误或者异常行为,在调试过程中可考虑以下几点: - 查看dmesg日志获取更多信息; - 确认依赖项已正确定义并存在; - 如果涉及到硬件访问,则注意权限设置及隔离策略的影响,比如前面提到的安全引导限制情况下的VFIO应用。 另外需要注意的是,虽然NAPI机制增强了多核环境下的性能表现[^4],但在某些特定场景下也可能暴露出其自身的不足之处,所以在设计高性能网络应用程序时应综合考量各种因素。 #### 参考资料关联说明 上述讨论涵盖了从基础知识介绍到实际编码实践再到潜在障碍克服等多个层面的内容,并适当引用了相关参考资料来增强论述的专业性和权威度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值