编写Linux内核模块

最近由于学习需要,学习了一下Linux内核模块的编写方法,特此把学习过程中的问题记录下来!!!

//
//hello.c
//
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

static int hello_init(void) {
	printk(KERN_WARNING "Module init: Hello world!\n");
	return 0;
}

static void hello_exit(void) {
	printk(KERN_WARNING "Module exit: bye-bye\n");
}

module_init(hello_init);
module_exit(hello_exit);


最后两行指定了模块加载和卸载时执行的函数,加载时执行hello_init,卸载时执行hello_exit。


下面是Makefile文件

ifneq ($(KERNELRELEASE),)
	obj-m:=hello.o
else
	KDIR := /lib/modules/$(shell uname -r)/build


all:
	make -C $(KDIR) M=$(PWD) modules
clean:
	make -C $(KDIR) M=$(PWD) clean
endif


KDIR指向了系统当前内核的源代码树(build是源代码目录的一个链接,源代码一般在/usr/src/kernels/下面)。

之前我有更新系统,把我的源代码给删掉了,致使build是个无效的链接,导致编译不通过,后来我把

对应版本的源代码装上,并给其创建一个build链接复制到KDIR目录下覆盖无效的那个链接,编译就成功。

可通过以下命令安装源代码树:

[root@localhost ~]# uname -r
3.1.0-7.fc16.i686.PAE

查询当前系统的内核版本

[root@localhost ~]# rpm -qa | grep kernel*

kernel-PAE-devel-3.3.0-4.fc16.i686
kernel-PAE-3.3.0-4.fc16.i686
kernel-headers-3.3.0-4.fc16.i686
libreport-plugin-kerneloops-2.0.8-4.fc16.i686
abrt-addon-kerneloops-2.0.7-2.fc16.i686
kernel-devel-3.3.0-4.fc16.i686

先查询相关的内核包。没有当前内核版本的源代码包和开发包。

参照上面的格式把它安装上。

[root@localhost ~]# yum install kernel-PAE-devel-3.1.0-7.fc16.i686
[root@localhost ~]# yum install kernel-PAE-3.1.0-7.fc16.i686
安装好后,/usr/src/kernels目录下会有相应版本的源代码。


条件都具备了就可以编译模块了。在hello.c文件目录下执行make命令就会调用Makefile来编译。

编译好后,会生成一个内核模块hello.ko。这就是我们编译好的内核模块,接下来加载它,并查看结果。

[root@localhost demo]# insmod hello.ko
[root@localhost demo]# dmesg | tail -n 5
[ 2445.017321] virbr0: port 2(vif1.0) entering forwarding state

[ 2445.017439] virbr0: port 2(vif1.0) entering disabled state

[ 2494.639683] hello: module license 'unspecified' taints kernel.

[ 2494.639688] Disabling lock debugging due to kernel taint

[ 2494.639841] Module init: Hello world!


最后一条消息就是我们编写的模块的输出。

 
 
 
 

                
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 编写Linux内核模块需要掌握C语言编程和Linux内核的基本知识。以下是编写Linux内核模块的基本步骤: 1. 编写模块代码:使用C语言编写模块代码,包括模块初始化和清理函数。 2. 编写Makefile文件:Makefile文件用于编译和链接模块代码。 3. 编译模块:使用make命令编译模块代码,生成.ko文件。 4. 加载模块:使用insmod命令加载模块。 5. 卸载模块:使用rmmod命令卸载模块。 6. 查看模块信息:使用lsmod命令查看已加载的模块信息。 编写Linux内核模块需要注意以下几点: 1. 模块代码必须遵循Linux内核的编程规范。 2. 模块代码必须与当前内核版本兼容。 3. 模块代码必须具有正确的权限和安全性。 4. 模块代码必须经过充分的测试和验证。 总之,编写Linux内核模块需要认真学习和掌握相关知识,同时注重代码质量和安全性。 ### 回答2: Linux内核模块是向Linux内核添加新功能的一种方法。编写Linux内核模块需要一定的编程技能和一定的Linux操作系统知识。 首先,需要安装Linux操作系统、开发工具和编译器,如gcc和make。接着,需要了解Linux内核模块的编程API和编程语言,如C语言。可以通过阅读Linux内核源代码和其文档来了解这些方面的知识。 然后,可以开始编写内核模块代码。在编写Linux内核模块时,需要遵循特定的格式和样式。首先,需要包含Linux内核头文件,然后定义模块初始化函数和模块卸载函数。模块初始化函数将会在模块加载时启动,而模块卸载函数则会在模块被卸载时被调用。需要编写代码实现模块所需的功能。 在完成代码编写后,可以使用makefile文件来编译和构建模块。makefile定义编译规则和操作,如编译器选项和链接库。编译完成后,需要使用insmod命令将模块加载到内核中。可以使用lsmod命令检查模块是否加载成功。如果需要卸载模块,可以使用rmmod命令进行卸载。 总的来说,要编写Linux内核模块需要一定的技能和知识,但如果对Linux内核熟悉的话,编写内核模块并不是一件非常困难的事情。对于初学者来说,最好仔细阅读Linux内核源代码和文档,并花费时间去理解Linux的工作原理和内核API。 ### 回答3: 编写 Linux 内核模块可以实现 Linux 系统的定制化和扩展化,可以为系统添加新的功能或者修改系统现有的功能。创建内核模块是增加 Linux 内核灵活性的威力工具之一。 以下是编写 Linux 内核模块的步骤: 1. 安装编写内核模块所需的开发工具:通常情况下需要安装 Linux 内核头文件和编译工具包。 2. 创建一个新的内核模块源文件:编写一个包含必要模块初始化函数和清理函数的源文件。 3. 编写模块初始化函数: 初始化函数是一个从内核开始执行到模块加载时调用的函数,它在模块加载时初始化模块状态。 4. 实现模块功能: 在初始化函数中实现模块的功能,例如向系统添加新的设备驱动程序,注册新的文件系统或者添加扩展虚拟文件系统等。 5. 注册模块和退出: 在模块初始化函数中通过注册一些关键信息和环境变量来告诉内核如何正确处理模块,使用函数 module_init() 和 module_exit() 注册和退出模块。 6. 编译模块: 通过编译命令将源文件编译为动态的共享库,然后将目标文件移动到内核可加载模块目录中。 7. 加载内核模块: 使用 modprobe 命令加载编译好的内核模块,模块将会被加载到内核中并且驱动尝试去执行初始化函数。 8. 卸载内核模块: 通过 rmmod 命令卸载内核模块,该命令将会在模块退出函数中被执行,协助系统将资源交还给内核。 总而言之,编写 Linux 内核模块需要熟悉系统 API 接口和底层机制,才能设计和编写可靠高效的程序。编写好的内核模块可以定制化和扩展系统的功能,使该系统得以满足特定的应用需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值