预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

内核日志:API及实现http://www.ibm.com/developerworks/cn/linux/l-ke... 中文zzhhaannggddii__cchhiinnaa 技技术术主主题题软软件件下下载载社社区区技技术术讲讲座座 内内核核日日志志::AAPPII及及实实现现 从内核到用户空间的日志 M.TimJones,独立撰稿人 简简介介::在内核开发中,我们通常使用printk进行日志。但是您曾经考虑过它的过程,以及内核日志的底层实现吗?本文介绍了内核日志的整个过 程,包括printk及用户空间日志文件的插入。 发发布布日日期期::2010年11月09日 级级别别::中级 其其他他语语言言版版本本::英文 访访问问情情况况::10103次浏览 评评论论::0(查看|添加评论) 平均分(3个评分) 为本文评分 TTiimm的的联联系系方方式式 Tim是最著名且多产的撰稿人之一。浏览developerWorks上Tim的所有文章。访问Tim的帐户。然后在MydeveloperWorks与Tim、其他作者 及读者联系交流。 使用日志进行调试的方法由来已久。日志不仅在理解系统的内部操作方面很有用,而且对于通过时间标记的日志中按时间顺序排列的消息所记录的系统 活动的计时和关系也非常有用。 本文首先通过介绍用于配置和收集日志信息的应用程序接口(API)来说明了内核的日志(见图1关于总结框架和组件的示意图)。然后,本文介绍了 日志数据从内核到用户空间的移动过程。最后,本文还介绍了基于内核的日志数据的目标:用户空间中使用rsyslog进行日志管理。 图图11..内内核核日日志志生生态态系系统统和和主主要要组组件件 内核API 内核的日志是通过printk函数实现的,它与用户空间对应函数printf(按格式打印)具有相似的作用。printf命令在编程语言中已存在很长 时间,最近出现是在C语言中,但是最早出现可以追溯到50年代和60年代的Fortran(PRINT和FORMAT语句)、BCPL(writf函数;BCPL 是C的前身)和ALGOL68语言(printf和putf)。 在内核中,printk(打印内核)可以使用与printf函数几乎一样的格式将将格式化消息写入到缓冲区。您可以在./linux/include/linux /kernel.h(及其实现./linux/kernel/printk.c)中看到printk的格式: intprintk(constchar*fmt,...); 这个格式表示的是一个用于定义文本和格式的字符串(类似于printf),它同时带有一组可变个数参数(由省略号表示[...])。 内内核核配配置置与与错错误误 通过printk实现的日志是通过内核配置选项CONFIG_PRINTK激活的。虽然CONFIG_PRINTK一般都是激活的,但是不包含这个选项的系统 对内核的调用会返回一个ENOSYS错误返回值。 在使用printk时,您首先会发现的不同点更多是关于协议,而不是功能的。这个特性使用了C语言的一种模糊方面来简化消息级别和优先级的规 12-2-24上午11:40 内核日志:API及实现http://www.ibm.com/developerworks/cn/linux/l-ke... 范。内核允许每一个消息根据日志级别(定义不同消息重要必的八种级别之一)来分类。这些级别可以用来判断系统是否不可用(紧急消息)、是否发 现严重状况(严重消息)或者是否为简单报告消息。这个内核代码直接将日志级别定义消息的第一个参数,下面这个例子说明的就是严重消息的定义: printk(KERN_CRIT"Errorcode%08x.\n",val); 注意,第一个参数并不一个真正的参数,因为其中没有用于分隔级别(KERN_CRIT)和格式字符的逗号(,)。KERN_CRIT本身只是一个普通的字 符串(事实上,它表示的是字符串"<2>";表1列出了完整的日志级别清单)。作为预处理程序的一部分,C会自动地使用一个名为字符串串联的 功能将这两个字符串组合在一起。组合的结果是将日志级别和用户指定的格式字符串包含在一个字符串中。注意,如果调用者未将日志级别提供给 printk,那么系统就会使用默认值KERN_WARNING(表示只有KERN_WARNING级别以上的日志消息会被记录。) 表表11..日日志志级级别别、、标标识识符符和和使使用用方方法法 标标识识符符字字符符串串使使用用方方法法 KERN_EMERG<0>紧急消息(导致系统崩溃) KERN_ALERT<1>必须立即处理的错误 KERN_CRIT<2>严重错误(硬件或软件) KERN_ERR<3>错误状况