我想了解如何打印k那么,Linux 内核日志消息是如何在幕后工作的呢?
答案1
太巧了,我刚刚在书上看到过Linux 设备驱动程序v3。 第4章那本书说:
消息如何记录
该
printk
函数将消息写入__LOG_BUF_LEN
字节长的循环缓冲区:配置内核时选择的从 4 KB 到 1 MB 的值。然后,该函数会唤醒任何正在等待消息的进程,即任何在系统调用中休眠syslog
或正在读取的进程/proc/kmsg
。日志引擎的这两个接口几乎是等效的,但请注意,读取会/proc/kmsg
消耗日志缓冲区中的数据,而syslog
系统调用可以选择返回日志数据,同时将其留给其他进程。一般来说,读取/proc
文件更容易,并且是klogd
.该dmesg
命令可用于查看缓冲区的内容而不刷新它;实际上,该命令返回stdout
缓冲区的全部内容,无论是否已被读取。如果您碰巧手动读取内核消息,在 stop 后
klogd
,您会发现该/proc
文件看起来像一个 FIFO,因为读取器会阻塞,等待更多数据。显然,如果另一个进程已经在读取相同的数据,您就不能以这种方式读取消息klogd
,因为您会争夺它。如果循环缓冲区已满,printk
则回绕并开始将新数据添加到缓冲区的开头,覆盖最旧的数据。因此,日志记录过程会丢失旧数据。 ...Linux 消息传递方法的另一个特点是printk
可以从任何地方调用,甚至可以从中断处理程序调用,并且对可以打印的数据量没有限制。唯一的缺点是可能会丢失一些数据。