Linux-kernel:printk()索引

2021-06-11 19:31:16

问题是,虽然通过printk()发出的消息(以及在其顶部的顶部分层的函数上)发出的消息,但是用户空间工具消耗的消息,那些消息从未被认为是TheKernel' s abi的一部分因此,内核开发人员随时可随时更改(或删除)它们。对任何创造巨大的法规集产的人来说,这对任何人都有麻烦意味着检测感兴趣的信息;它还在将消息转换为其他语言时,它也会挫败任何差点。多年来有很多尝试解决这个问题。 2011内核峰会围绕一个梳地址,提议为每个KernelMessage添加128位二进制标记。那个想法,就像以前和之后的所有人一样,未能在主线附近覆盖。内核社区非常简单地,毫无疑问,需要在通过Printk()上删除的日志信息上的任何结构;需要的额外努力不起作用。克里斯下来发布的最新建议并没有试图施加任何影响结构。相反,它只是收集内置内核中内置的每个打印块()格式化字符串,并使它们通过文件Indebugfs提供全部可用。具体来说,printk()成为一个包装器宏,Chro comlares一个新的结构来保存格式信息:struct pi_entry {const char * fmt; const char * func; const char *文件; unsigned int行; const char *水平; const char * pre_fmt; const char * post_fmt; };

这种结构将传入的格式字符串持有到printk(),沿着日志级别,关于源在源中的信息,此呼叫的信息将被火烧,和#34; pre"和#34;帖子"由各种包装器添加的数据(此类Asthe dev_printk()函数)。该结构被置于构建内核的缺点部分(.printk_index)中。 Wrapperalso调用原始的printk() - 现在被称为_printk() - 当然,输出消息。构建内核时,所有这些PI_ENTY结构都将在.printk_Index部分中释放在一起。在MountingDebugfs之后,管理员可以查看Printk / Index / VMLinux,这可以将整套格式集合;每个可加载模块都有打印/索引下的文件。分页通过这些文件,该文件将包含数千个格式的字符串,这可能几乎暗中作为管理员和#39; S社交媒体饲料,但这是预期用途的。相反,监视系统可以使用此信息来使其所有测试仍然匹配内核瞬间发出的消息。如果和#34; CPU在火上"测试不再找到匹配,CPU已被渲染防火或消息已被加入。如果后者证明是这种情况,可以更新测试。在这个补丁集已经看到的最小审查中,有几个有趣的问题并没有提出,因为这篇补丁集所见的最小审查。首先是:为什么需要将此信息内置于科内尔?它可以放入一个单独的文件中,该文件不会在运行系统上遗留。或许,答案是,这种机制可以轻松地保持正确的格式字符串与跨系统部署的内核。另一种是,Debugfs明确地没有用于生产系统,但此功能如图所示,它意味着与生产金一起使用。如果这种机制被接受到主线中,它可能会在更稳定的环境中找到一个家庭,如/ sys。但是,是否被接受仍有待观察。由于Thismechanism不需要从内核开发人员提供任何额外的努力,因为它在关闭时不会产生成本,因此它可能会遇到比以前的努力轻松缓解Kernellog消息的努力。如果是这样,监控系统将不会被vancingkernel日志消息屏蔽,但它们至少会知道它们的测试何时需要。 ( 登录后发表评论)