Chinaunix首页 | 论坛 | 博客
  • 博客访问: 289587
  • 博文数量: 49
  • 博客积分: 3083
  • 博客等级: 中校
  • 技术积分: 710
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 08:22
文章分类

全部博文(49)

文章存档

2009年(8)

2008年(41)

分类: LINUX

2008-07-01 21:12:54

    如何在不重新编译内核的情况下,为内核添加新的功能呢??这个就可以使用模块来实现了。模块本身不编译进内核,但是运行时可以达到内核其他部分一样的效果。先来看段模块的示例代码

/*
 *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吧。

obj-m := a.o

接着在命令行中使用 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模块的详细信息。
阅读(1589) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~