您的位置:首页 > 运维架构 > Linux

编译安装linux内核模块

2015-06-09 20:24 218 查看
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的信息打印:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: