20135307张嘉琪git
printk()和printf()在使用上最主要的区别就是前者能够指定一个日志级别。算法
内核根据这个级别来判断是否在终端上打印消息。安全
内核把级别比某个特定值低的全部消息显示在终端上。架构
内核消息都被保存在一个LOGBUFLEN大小的环形队列中。该缓冲区大小能够在编译时经过设置CONFIG_LOGBUFSHIFT进行调整。在单处理器的系统上其默认值是16KB。换句话说,就是内核在同一时间只能保存16KB的内核消息。若是消息队列已经达到最大值,那么若是再有printk()调用时,新消息将覆盖队列中的老消息。这个记录缓冲区之因此称为环形是由于它的读写都是按照环形队列方式进行操做的。编辑器
使用环形队列有许多好处。因为同时读写环形缓冲区时,其同步问题很容易解决,因此即便在中断上下文中也能够方便地使用printfk()。此外,它使记录维护起来也更容易。若是有大量的消息同时产生,新消息只需覆盖掉旧消息便可。在某个问题引起大量消息的时候。记录只会覆盖掉它自己,而不会由于失控而消耗掉大量内存。而环形缓冲区的惟一缺点——可能会丢失消息可是与简单性和健壮性的好处相比这点代价是值得的。函数
oops是内核告知用户有不行法神最经常使用的方式。工具
oops中包含的重要信息对于全部体系结构都是彻底相同的:寄存器上下文和回溯线索。oop
回溯线索显示了致使错误发生的函数调用链。这样咱们就能够观察究竟发生了什么:机器处于空闲状态,正在执行idle循环,由cpuidle()循环调用defaultidle()。此时定时器中断产生了,它引发了对定时器的处理,tulip_timer()这个定时器处理函数被调用,而就是它引用了空指针。甚至能够经过偏移量找出致使问题的语句。性能
一些内核调用能够用来方便标记bug方便标记bug提供断言并输出信息。最经常使用的两个是BUG()和些声明BUG_ON()。当被调用的时候,它们会引起oops,致使栈的回溯和错误信息的打印。大部分体系结构把BUG()和BUG_ON()定义成某种会致使oops跟硬件的体系结构是相关的非法操做,这样天然会产生须要的oops。能够把这些调用当作断言使用,想要断言某种状况不应发生。测试
18.7 神奇的系统请求键
系统请求键功能能够经过定义CONFIGMAGICSYSRQ配置选项来启用。
当该功能被启用的时候,不管内核处于什么状态,均可以经过特殊的组合键跟内核进行通讯。这种功能可让你在面对一台奄奄一息的系统时能完成一些有用的工做。除了配置选项之外,还要经过一个sysctl用来标记该特性的开或关。
须要启用它时使用以下命令:echo 1> /proc/sys/kernel/sysrq
。