我正在编写一个Linux字符驱动程序,它可以在用户空间打印系统日志,就像命令“ dmesg”一样。
我已经了解到,我们使用“ printk”打印的所有日志都将被发送到一个名为环形缓冲区(ring buffer)的空间中。所以我有以下问题:
- 环形缓冲区是否在内核空间中?
- 如果是,我该如何在内核空间中读取环形缓冲区?(我已经尝试阅读了“ dmesg.c”的源代码,但没有帮助。)
我正在编写一个Linux字符驱动程序,它可以在用户空间打印系统日志,就像命令“ dmesg”一样。
我已经了解到,我们使用“ printk”打印的所有日志都将被发送到一个名为环形缓冲区(ring buffer)的空间中。所以我有以下问题:
这是针对Pavan非常好的答案(让我学到了很多)的进一步解释:
不同的发行版可能会将/proc/kmsg的输出重定向到任何物理日志文件或虚拟设备(/dev/xxx),但是"/proc/kmsg"是内核日志的原始来源,因为内核在fs/proc/kmsg.c内实现其环形缓冲操作:
static const struct file_operations proc_kmsg_operations = {
.read = kmsg_read,
.poll = kmsg_poll,
.open = kmsg_open,
.release = kmsg_release,
.llseek = generic_file_llseek,
};
那么你看到的输出是这样的:
sudo tail -f /proc/kmsg
但是你只能看到在发出此命令之后生成的所有消息-环形缓冲区中的所有先前消息都不会被打印出来。因此,要查看物理文件输出,可以搜索“/proc/kmsg”的用户:
sudo lsof | grep proc.kmsg
我的机器显示如下:
rsyslogd 1743 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
in:imuxso 1743 1755 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
in:imklog 1743 1756 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
rs:main 1743 1757 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
现在它的进程ID是1743,让我们来看看1743打开的文件描述符:
sudo ls -al /proc/1743/fd
lrwx------ 1 root root 64 Dec 11 08:36 0 -> socket:[14472]
l-wx------ 1 root root 64 Dec 11 08:36 1 -> /var/log/syslog
l-wx------ 1 root root 64 Dec 11 08:36 2 -> /var/log/kern.log
lr-x------ 1 root root 64 Dec 11 08:36 3 -> /proc/kmsg
l-wx------ 1 root root 64 Dec 11 08:36 4 -> /var/log/auth.log
所以,pid 1743是rsyslogd,它将/proc/kmsg的输出重定向到像/var/log/syslog和/var/log/kern.log等文件中。