Username: Password:

在2.6的内核上编译内核模块
来源: ChinaUnix博客  作者: ChinaUnix博客   发布时间:2008-04-28 08:39:06

昨天尝试了编译内核模块,经过多次尝试,终于成功。

2006-6-17
    今天打算尝试使用编译模块的方法查看printk的几种模式下的输出情况。
但是,编译的不是很顺利,原来2.6的编译方法跟之前是不相同的。
    成功前的最后一次修改是将init_module和cleanup_module的函数名修改为myinit_module和mycleanup_module,他们和/linux/modules.h中的函数重名了。
源文档见附录。
    结果出来了。必须在非图像化的终端下才能使用printk输出。奇怪的是,KERN_WARNING这些printk的选项没有起到什么作用。原来还以为这些选项会造成输出
到终端还是日志文档的,现在看来效果都相同。
编译方法:
1 建立一个极简单的makefile文档:obj-m := hello.o
2 在命令行输入(以终极用户身份:su -):
make -C /usr/src/linux-2.6.1 SUBDIRS=$PWD modules
执行过程:
#insmod hello.ko
KERN_EMERG  : Hello, world!
KERN_ALERT  : Hello, world!
KERN_CRIT   : Hello, world!
KERN_ERR    : Hello, world!
KERN_WARNING: Hello, world!
KERN_NOTICE : Hello, world!
KERN_INFO   : Hello, world!
#rmmod hello.ko
It’s over.
另外第一次执行insmod的时候会弹出
Message from syslogd@ljd at Sun Jun 18 16:33:09 2006 ...
ljd last message repeated 3 times
printk是输出到日志文档中去的。在/var/log/message中能够找到输出结果。
参考资料:
1       > by Ori Pomerantz
        讲内核模块编译,但是是基于2.4的
2       > by William von Hagen
        讲了2.4内核和2.6内核的在编译内核模块上的区分
-----------------------------------------------------------------------
附录:
/*
* hello.c
* Copyright (C) 2006 by ljd
*
* "Hello, world" - the kernel module version
* with different tag in printk
*
*/
#include
#include  /*有没有都没所谓,在module.h中已有了*/
#include
MODULE_LICENSE("GPL");
/*
   in /linux/kernel.h
KERN_EMERG      ""    system is unusable
KERN_ALERT      ""    action must be taken immediately
KERN_CRIT       ""    critical conditions
KERN_ERR        ""    error conditions
KERN_WARNING    ""    warning conditions
KERN_NOTICE     ""    normal but significant condition
KERN_INFO       ""    informational
KERN_DEBUG      ""    debug-level messages
*/
static int __init myinit_module()
{
        printk(KERN_EMERG  "KERN_EMERG  : Hello, world!\n");
        printk(KERN_ALERT  "KERN_ALERT  : Hello, world!\n");
        printk(KERN_CRIT   "KERN_CRIT   : Hello, world!\n");
        printk(KERN_ERR    "KERN_ERR    : Hello, world!\n");
        printk(KERN_WARNING"KERN_WARNING: Hello, world!\n");
        printk(KERN_NOTICE "KERN_NOTICE : Hello, world!\n");
        printk(KERN_INFO   "KERN_INFO   : Hello, world!\n");
        printk(KERN_DEBUG  "KERN_DEBUG  : Hello, world!\n");      
        return 0;
}
static void __exit mycleanup_module()
{
        printk("It’s over.\n");
}
/* 向内核注删这两个函数 */
module_init(myinit_module);
module_exit(mycleanup_module);


喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅