如何在不重新编译内核的情况下,为内核添加新的功能呢??这个就可以使用模块来实现了。模块本身不编译进内核,但是运行时可以达到内核其他部分一样的效果。先来看段模块的示例代码
/*
*author: liuweni
*date: 06/30/2008
*fileName: a.c
*/
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void){
printk(KERN_ALERT "HELLO WORLD\n");//print a message
return 0;
}
static void hello_exit(void){
printk(KERN_ALERT"EXIT\n");//print a message
}
module_init(hello_init);//init module .It's necessary
module_exit(hello_exit);//exit module .It's necessary
MODULE_LICENSE("GPL");//which license suit for this module.it's necessary.
MODULE_AUTHOR("liuweni");//author name
MODULE_DESCRIPTION("this a module");//this module's description
MODULE_ALIAS("module_alias");//this module's alias
MODULE_VERSION("v0.1");//this module's version info
|
这段代码的作用是在该模块加载的时候显示HELLO WORLD,而在退出时提示EXIT,仅仅有这些功能了。
此段代码中的必须代码是mdoule_init();在加载模块时运行参数中的函数.module_exit();在退出模块的时候运行参数中的函数。MODULE_LICENSE()声明该模块使用的协议.其他的都是可选的。在hello_init和hello_exit中的printk可以将信息输出到/var/log/dmesg中,也可以在终端中输入dmesg中查看.
好了,现在代码写好了,到了编译模块的时候了,我们写个简单的makefile吧。
接着在命令行中使用 make -C /usr/src/linux-headers-2.6.24-19-generic M=$(pwd) modules编译此模块,-C后面指明内核源代码的路径,-M后面指明了当前工程所在的路径。
接着就可以运行了,insmod ./a.ko将a这个内核模块加载到系统中,需要卸载的时候使用rmmod a就可以了,假如需要确认当前的模块是否已经在系统加载了的模块中,可以使用lsmod查看当前系统所有加载了的模块,当然grep也是个不错的辅助命令。modinfo a可以查到a模块的详细信息。
阅读(1603) | 评论(0) | 转发(0) |