如何在Linux内核空间读取环形缓冲区?
问题描述:
我正在写一个Linux字符驱动程序,它可以在用户空间中打印系统日志。就像命令'dmesg'一样。 我知道我们用'printk'打印的所有日志都会被发送到名为环形缓冲区的空间。所以我有这样的问题:如何在Linux内核空间读取环形缓冲区?
- 是在内核空间内的环形缓冲区?
- 如果是这样,我怎样才能读取内核空间内的环形缓冲区? (我尝试读取dmesg.c的源代码,但它没有帮助。)
答
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,
};
所以你怎么看到的输出是这样的:
须藤尾-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
所以现在是PID 1743,让我们来看看这些文件FD由1743打开:
须藤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等
文件10
令人惊叹!非常专业和有用的答案!你看,我只是Linux内核编程的新成员,我无法感谢你的帮助。谢谢你,兄弟。 – 2012-03-03 05:43:34
很高兴我能帮助你:)欢迎来到SO! – 2012-03-03 06:11:03