- 论坛徽章:
- 0
|
昨天尝试了编译内核模块,经过多次尝试,终于成功。
![]()
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 |
|