如何在Linux内核空间读取环形缓冲区?

24

我正在编写一个Linux字符驱动程序,它可以在用户空间打印系统日志,就像命令“ dmesg”一样。

我已经了解到,我们使用“ printk”打印的所有日志都将被发送到一个名为环形缓冲区(ring buffer)的空间中。所以我有以下问题:

  1. 环形缓冲区是否在内核空间中?
  2. 如果是,我该如何在内核空间中读取环形缓冲区?(我已经尝试阅读了“ dmesg.c”的源代码,但没有帮助。)
2个回答

48
你要找的是/proc/kmsg,这是内核环形缓冲区!
  1. 是的,它在内核空间中。任何试图读取它的进程都应该拥有超级用户权限才能读取它!

  2. 如何读取环形缓冲区?下面是IBM Developerworks提供的漂亮插图。

Reading the Kernel Ring Buffer

将是您的首选!dmesg如何实现其任务?通过调用!syslog如何工作?通过系统调用接口,该接口再次调用。 像this一样完成最后的操作。

以下是一些更多资源,可为您提供有关/ proc / kmsg和内核日志记录的更多信息-

  1. http://www.makelinux.net/ldd3/chp-4-sect-2

  2. http://www.ibm.com/developerworks/linux/library/l-kernel-logging-apis/index.html

  3. http://oguzhanozmen.blogspot.in/2008/09/kernel-log-buffering-printk-syslog-ng.html


太棒了!非常专业和有帮助的回答!你知道,我只是一个 Linux 内核编程的新手,我再怎么感激你的帮助也不过分。谢谢你啊。 - Yingyi Xu
很高兴能帮到你 :) 欢迎来到SO! - Pavan Manjunath

5

这是针对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等文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接