免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 832 | 回复: 0
打印 上一主题 下一主题

在2.6的内核上编译内核模块 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-18 16:51 |只看该作者 |倒序浏览
昨天尝试了编译内核模块,经过多次尝试,终于成功。

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);


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/20704/showart_129566.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP