Как читать кольцевой буфер в пространстве ядра Linux?

Я пишу драйвер символов Linux, который может печатать системные журналы в пользовательском пространстве. Так же, как и команда dmesg. Я узнал, что весь журнал, который мы печатаем с помощью "printk", будет отправлен в пространство с кольцевым буфером. Поэтому у меня есть вопросы:

  • Является ли кольцевой буфер внутри пространства ядра?
  • Если да, то как я могу прочитать кольцевой буфер внутри пространства ядра? (Я пытался прочитать исходный код dmesg.c. Но это не помогло.)

Ответы

Ответ 1

То, что вы ищете, это /proc/kmsg. Это буфер кольцевого кольца!

  • Да, это внутри пространства ядра. Любой процесс, пытающийся прочитать его, должен иметь привилегии суперпользователя, чтобы прочитать его!

  • Как читать кольцевой буфер? Вот красивая иллюстрация от IBM Developerworks

Reading the Kernel Ring Buffer

dmesg станет вашим первым курортом! Как dmesg выполнить свою задачу? По вызову syslog()! Как syslog выполнять свою работу? Через интерфейс системного вызова, который в свою очередь вызывает do_syslog(). do_syslog() делает финишный акт как this.

Вот еще несколько ресурсов, чтобы получить дополнительную информацию о /proc/kmsg и общем запуске ядра -

Ответ 2

Это касается Павана очень хорошего ответа (многому научил меня):

Различные дистрибутивы могут перенаправлять вывод /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

Итак, теперь это pid 1743, посмотрим файлы fd, открытые 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 и т.д.