谁能看懂内核模式打印驱动程序的打印信息

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 41, 距离下一级还需 159 积分
论坛徽章:0
有的时候调试内核程序,经常要将信息打印到其他地方如指定文件或终端还有网络,&&网络的话dreanice版主写过个netconsole我这里就不说了...
打印到文件:
& &
#include &linux/kernel.h&
#include &linux/module.h&
#include &linux/init.h&
#include &linux/fs.h&
#include &linux/string.h&
#include &linux/mm.h&
#include &linux/syscalls.h&
#include &asm/unistd.h&
#include &asm/uaccess.h&
#define MY_FILE &/root/LogFile&
char buf[128];
struct file *file = NULL;
static int __init init(void)
{
& && &&&mm_segment_t old_
& && &&&printk(&Hello, I'm the module that intends to write messages to file.\n&);
& && &&&if(file == NULL)
& && && && && & file = filp_open(MY_FILE, O_RDWR | O_APPEND | O_CREAT, 0644);
& && &&&if (IS_ERR(file)) {
& && && && && & printk(&error occured while opening file %s, exiting...\n&, MY_FILE);
& && && && && & return 0;
& && &&&}
& && &&&sprintf(buf,&%s&, &The Messages.&);
& && &&&old_fs = get_fs();
& && &&&set_fs(KERNEL_DS);
& && &&&file-&f_op-&write(file, (char *)buf, sizeof(buf), &file-&f_pos);
& && &&&set_fs(old_fs);
& && &&&return 0;
}
static void __exit fini(void)
{
& && &&&if(file != NULL)
& && && && && & filp_close(file, NULL);
}
module_init(init);
module_exit(fini);
MODULE_LICENSE(&GPL&);
打印到终端:
#include &linux/kernel.h&
#include &linux/module.h&
#include &linux/init.h&
#include &linux/sched.h&
#include &linux/tty.h&
MODULE_LICENSE(&GPL&);
MODULE_AUTHOR(&mq110&);
static void print_string(char *str)
{
& & struct tty_struct *my_
& & my_tty = current-&signal-&
& & if (my_tty != NULL)
& & {
& && &&&my_tty-&driver-&write(my_tty,str,strlen(str));
& && &&&my_tty-&driver-&write(my_tty,&\015\013&,2);
& & }
}
static int __init print_string_init(void)
{
& & print_string(&Hello world!&);
& & return 0;
}
static void __exit print_string_exit(void)
{
& & print_string(&Goodbye world!&);
}
module_init(print_string_init);
module_exit(print_string_exit);
修改一下/etc/syslog.conf 文件
#kern.*& && & /dev/console
你打印的东西可能是某个级别的信息。比如说debug,这用printk 可以控制 。
那么就写程
kern.debug /var/log/kern_debug.log
-------------------------
printk(KERN_ALERT &Hello, world\n&);
/etc/syslog.conf 中的
kern.alert& && && && && && && & /kernel.txt
实验成功,修改后要执行
server syslogd restart 重启日志服务。
此方法等于用日志服务帮你做这个事情。该信息用
dmesg 命令也可以看到。
代码在Centos5.3& &2.6.18上测试过了
[ 本帖最后由 ubuntuer 于
11:53 编辑 ]
可用积分 +15
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
论坛徽章:36
多谢LZ分享。
建议: LZ最好说一下测试时使用的内核版本啊。
论坛徽章:4
在打印oops到文件下血本了
白手起家, 积分 41, 距离下一级还需 159 积分
论坛徽章:0
原帖由 T-Bagwell 于
10:25 发表
在打印oops到文件下血本了
呵呵&&最近刚找完工作,比较空虚就研究研究内核了^_^
白手起家, 积分 41, 距离下一级还需 159 积分
论坛徽章:0
原帖由 Godbach 于
10:05 发表
多谢LZ分享。
建议: LZ最好说一下测试时使用的内核版本啊。
恩&&先的代码由于copy有误已经修改了&&测试的内核版本也注明了
丰衣足食, 积分 848, 距离下一级还需 152 积分
论坛徽章:0
还是内核读写文件,咋开始刮这阵风了
论坛徽章:36
在2.6.18.3上测试了LZ提供的两个示例代码,都可以正常工作。
第二个打印到控制台的,同时测试了本机的终端和SSH登陆,都可以正确打印出信息。
论坛徽章:36
原帖由 ubuntuer 于
11:55 发表
恩&&先的代码由于copy有误已经修改了&&测试的内核版本也注明了
我说呢。刚才我正想发帖说这个问题呢:
& && &&&my_tty-&driver-&write(my_tty,str,strlen(str));
& && &&&my_tty-&driver-&write(my_tty,&\015\013&,2);
记得你原先write写了四个参数,但是回头又看了一下,又成三个了。还以为我自己看错了呢。
原来是LZ修改了,呵呵
论坛徽章:4
原帖由 ruoyisiyu 于
12:00 发表
还是内核读写文件,咋开始刮这阵风了
有的时候看不到内核输出的某些信息,关键时刻就得这么做
相当于记录log了,呵呵
论坛徽章:3
回复 #1 ubuntuer 的帖子
不知道是否有验证过,在网络处理代码中进行文件读写,会不会有休眠问题引起的副作用。关于内核模块安装了,但是没有打印信息的解决
今天将编译好的内核模块hello.ko进行安装insmod
hello.ko,但是本来应该有的打印信息hello却没有打印。
lsmod发现内核模块已经安装了,后来在网上查找,如下解释的很好:
  我们可以看到生成了一个hello.o的内核模块,我们想通过这个模块在插入内核的时候输出
  "hello.word-this
is the kernel speaking"
  这样一条信息。
  然后我们开始:
  [root@localhost
root]# insmod hello.o
  [root@localhost
  并没有输出任何消息。why?
  这也是printf和printk的一个不同的地方
  用printk,内核会根据日志级别,可能把消息打印到当前控制台上,这个控制台通常是一个字符模式的终端、一个串口打印机或是一个并口打印机。这些消息正常输出的前提是──日志输出级别小于console_loglevel(在内核中数字越小优先级越高)。
  没有指定日志级别的printk语句默认采用的级别是
MESSAGE_LOGLEVEL(这个默认级别一般为&4&,即与KERN_WARNING在一个级别上),其定义在linux26/kernel/printk.c中可以找到
  日志级别一共有8个级别,printk的日志级别定义如下(在include/linux/kernel.h中):
  #define
KERN_EMERG 0
  #define
KERN_ALERT 1
  #define
KERN_CRIT 2
  #define
KERN_ERR 3
  #define
KERN_WARNING 4
  #define
KERN_NOTICE 5
  #define
KERN_INFO 6
  #define
KERN_DEBUG 7
  现在我们来修改hello.c程序,使printk的输出级别为最高:
  printk("&0&""hello.word-this
is the kernel speaking\n");
  然后重新编译hello.o,并插入内核:
  [root@localhost
root]# insmod hello.o
  [root@localhost
  Message
from syslogd@localhost at Sat Aug 15 05:32:22 2009 ...
  localhost
kernel: hello.word-this is the kernel speaking
  hello,world信息出现了。
  其实printk始终是能输出信息的,只不过不一定是到了终端上。我们可以去
  /var/log/messages这个文件里面去查看。
  如果klogd没有运行,消息不会传递到用户空间,只能查看/proc/kmsg
  通过读写/proc/sys/kernel/printk文件可读取和修改控制台的日志级别。查看这个文件的方法如下:
/proc/sys/kernel/printk 6 4 1 7
  上面显示的4个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日志级别和默认的控制台日志级别。
  可用下面的命令设置当前日志级别:
echo 8 & /proc/sys/kernel/printk
  这样所有级别&8,(0-7)的消息都可以显示在控制台上.
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 内核打印级别 的文章

 

随机推荐