编译安装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的信息打印:
- 编译安装linux内核模块
- Linux内核编译以及perfctr模块安装
- linux内核模块编译
- linux内核模块编译
- Linux内核模块编译
- Linux内核模块编译
- Linux 内核 模块 编译
- linux内核模块编译
- linux内核模块编译
- Linux内核模块编译
- Linux内核模块编译
- linux内核模块编译
- linux内核模块编译
- Linux编译内核模块
- Linux内核编译,内核模块编译加载
- 编译一个linux内核模块
- Linux内核模块编译指南
- linux内核模块编译步骤
- linux命令总结(二)
- @WebServlet的使用方法
- spark之hadoop2.6环境搭建笔记
- Spring4+Hibernate4+junit4环境搭建
- POJ2387---Til the Cows Come Home
- 编译安装linux内核模块
- LightOJ1021---Painful Bases (状压dp)
- HDU 1863-kruskal
- 数据库以及线程发生死锁的原理及必要条件,如何避免死锁
- linux命令总结(三)
- HDU1083 最大二分匹配
- C++中类的多态与虚函数的使用
- Java程序员的6个级别
- 快速幂取余