编译安装linux内核模块

来源:互联网 发布:中国知乎 编辑:程序博客网 时间:2024/05/21 13:22

linux提供了module机制,能够动态的加载内核模块,毕设中用到模块机制的主要原因是,因为更改代码可能会比较频繁,如果直接更改内核代码,编译内核,比较麻烦;而使用模块机制可以方便的实现模块的加载,对代码进行测试。

以下只是一个简单的demo,方便理解模块机制的原理:

 

编写模块代码(helloworld.c):

#include<linux/init.h>

#include<linux/kernel.h>

#include<linux/module.h>

 

int hello_init(void)

{

printk("Module init: helloworld!\n");

return 0;

}

 

void hello_exit(void)

{

printk("Module exit: Goodbye!\n");

}

 

module_init(hello_init);

module_exit(hello_exit);

然后编写helloworld.c的Makefile文件如下:

obj-m += helloworld.o

 

KERNEL_VERSION = /lib/modules/$(shell uname-r)/build/

 

all:

         make-C $(KERNEL_VERSION) M=$(PWD) modules

clean:

         make-C $(KERNEL_VERSION) M=$(PWD) clean

注释:Makefile文件中,obj-m += 后面的文件名字与编写好的模块文件同名的.o文件;其次,KERNEL_VERSION=内核源码的一个映射(其实就是内核源代码),在最底层的build目录中存放了内核源码的一个映射;all和clean中都要使用make –C命令进行,切记。

进入到当前目录,即helloworld.c文件和Makefile文件的目录下,输入make进行编译:

此时,编译成功,会在当前目录下生成一下和helloworld以及modules同名的文件,暂且不去深究他们的意思,只要找到一个helloworld.ko以.ko为后缀的文件就可以了。进行下一步,安装模块àinsmod 命令,如下:

[root@localhost module_test]# sudo insmodhelloworld.ko

为了验证模块是不是成功运行在了内核之中,可以对内核中运行的模块进行查看-->lsmod命令:


可以看到,第一个模块就是我们编译并运行成功的helloworld;只不过,我们在模块之中有打印信息的,现在没有看到。没关系,可以运行以下命令来看到原来代码中的打印信息,如下:


当然,我们编译安装了的模块也可以从内核中卸载掉,卸载的命令即是:rmmod,只是卸载模块的时候,rmmod后面跟的是模块名字,而不再和安装模块时候一样的.ko文件;而且,也可以用dmesg命令进行log的信息打印:


0 0
原创粉丝点击