linuxlogginglinux-kernelkernelcircular-buffer

How to read ring buffer within linux kernel space?


I'm writing a Linux character driver which can print system logs in user space. Just as the command 'dmesg' does. I've learned that all the log that we print with 'printk' will be sent to a space named ring buffer. So I have the questions:

  1. Is ring buffer inside kernel space?
  2. If so, how can I read the ring buffer inside kernel space? (I've tried to read the source code of dmesg.c. But it did not help.)

Solution

  • What you are looking for is /proc/kmsg. This is the kernel ring buffer!

    1. Yes, this is inside kernel space. Any process trying to read it should have super user privileges to read it!

    2. How to read it the ring buffer? Here is a beautiful illustration from IBM Developerworks

    Reading the Kernel Ring Buffer

    dmesg would be your first resort! How does dmesg accomplish its task? By a call to syslog()! How does syslog do its job? Through the system call interface which in turn call do_syslog(). do_syslog() does the finishing act like this.

    Here are a few more resources to get you more info about /proc/kmsg and kernel logging in general-

    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