linux添加可加载内核模块(LKM入门)
2012-03-08 21:45
1076 查看
学习linux内核编程,LKM(可加载内核模块)是非常有用的一部分。LKM是内核的扩展,可以随时加载到内核中,用完后也可以方便的卸载,是扩展linux内核功能的有效手段。
下面编写一个简单的模块,并实现加载:
代码如下:
解释:
模块需要至少需要两个函数module_init()和module_exit()。其中第一个是在安装模块时被调用,所有的初始化工作可以再其中完成。第二个函数是在卸载模块时调用,可以在其中做一些清理工作。
代码中printk()是输出显示数据的系统调用,其工作在内核空间中。
编译:
内核代码写好后,需要编译成可加载模块,需要在当前目录下创建一个Makefile文件,内容如下:
加载:
输入命令
insmod hellomodule.ko
即可将模块安装到内核中,其调用初始化函数时有一条打印语句,并不显示在屏幕上,需要输入 dmesg 命令才能看见。或者使用 lsmod 命令可以查看已加载的模块
卸载:
输入命令
rmmod hellomodule
即可卸载该模块。
下面编写一个简单的模块,并实现加载:
代码如下:
/*hellomodule.c*/
#include <linux/kernel.h> #include <linux/module.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("Module Author"); MODULE_DESCRIPTION("Module Description"); static int __init hello_init(void) { printk(KERN_ALERT "HelloModule is installed.\n"); return 0; } static void __exit hello_exit(void) { printk(KERN_ALERT "HelloModule is removed.\n"); } module_init(hello_init); module_exit(hello_exit);
解释:
模块需要至少需要两个函数module_init()和module_exit()。其中第一个是在安装模块时被调用,所有的初始化工作可以再其中完成。第二个函数是在卸载模块时调用,可以在其中做一些清理工作。
代码中printk()是输出显示数据的系统调用,其工作在内核空间中。
编译:
内核代码写好后,需要编译成可加载模块,需要在当前目录下创建一个Makefile文件,内容如下:
obj-m += hellomodule.o CUR_PATH := $(shell pwd) KERN_PATH := /usr/src/linux-headers-$(shell uname -r) all: make -C ${KERN_PATH} M=${CUR_PATH} modules clean: make -C ${KERN_PATH} M=${CUR_PATH} clean然后输入make指令进行编译,编译完成后即得到可加载模块hellomodule.ko
加载:
输入命令
insmod hellomodule.ko
即可将模块安装到内核中,其调用初始化函数时有一条打印语句,并不显示在屏幕上,需要输入 dmesg 命令才能看见。或者使用 lsmod 命令可以查看已加载的模块
卸载:
输入命令
rmmod hellomodule
即可卸载该模块。
相关文章推荐
- Linux可加载内核模块(LKM)
- Linux可加载内核模块(LKM)
- Linux 2.6.x 内核模块入门(LKM)
- 【内核】Linux添加系统调用(静态,非动态加载模块)
- Linux可加载内核模块(LKM)(转载)
- Linux可加载内核模块(LKM)
- Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法
- linux 内核学习----------模块(LKM:loading kernel module)
- Linux如何在系统启动时自动加载内核模块
- Linux 2.6.35内核配置 armv7 s5pv210 模块加载错误
- Linux 可加载内核模块剖析
- Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决办法
- Linux 2.6内核的编译步骤及模块的动态加载
- Linux 可加载内核模块剖析
- 在Linux 2.6内核下编译可以加载的内核模块
- CentOS 5.6下将linux内核2.6.18升级到2.6.30,并编译动态加载linux下第一个模块
- linux 添加内核模块
- Linux 2.6内核的编译步骤及模块的动态加载
- Linux 下内核模块的开发方式的记录 及问题解决(入门的Helloworld)
- Linux 可加载内核模块剖析