首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在linux内核空间中读取环形缓冲区?

如何在linux内核空间中读取环形缓冲区?
EN

Stack Overflow用户
提问于 2012-03-02 12:57:49
回答 2查看 17.3K关注 0票数 21

我正在编写一个Linux字符驱动程序,它可以在用户空间中打印系统日志。就像命令'dmesg‘一样。我已经了解到,我们用'printk‘打印的所有日志都将被发送到一个名为ring buffer的空间。所以我有个问题:

  1. 环形缓冲区在内核空间中吗?
  2. 如果是这样的话,如何读取内核空间中的环形缓冲区?(我试着阅读dmesg.c的源代码。但这没有帮助。)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-02 19:14:05

你要找的是/proc/kmsg。这是内核环缓冲区!

  1. 是的,这是在内核空间内。任何试图读取它的进程都应该拥有超级用户的权限来读取它!
  2. 如何读取它的环缓冲器?这里是来自IBM Developerworks的一幅美丽的插图。

dmesg将是你的第一选择!德梅斯是如何完成它的任务的?打电话给syslog()赛斯洛是如何完成它的工作的?通过系统调用接口,依次调用do_syslog()do_syslog()的结尾就像一样。

下面是一些关于/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
票数 47
EN

Stack Overflow用户

发布于 2015-12-11 00:52:25

这是Pavan非常好的回答(教了我很多):

不同的发行版可以将/proc/kmsg的输出重定向到他们喜欢的任何物理日志文件或虚拟设备(/dev/xxx)。但是"/proc/kmsg“是内核日志的原始来源,因为内核在fs/proc/kmsg.c内实现了它的环缓冲区操作:

代码语言:javascript
复制
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

我的机器显示:

代码语言:javascript
复制
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,让我们看看由1743打开的文件fd:

sudo ls -al /proc/1743/fd

代码语言:javascript
复制
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是etc,它将/proc/kmsg的输出重定向到/var/log/syslog和/var/log/kern.log等文件。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9533708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档