Страница 1 из 1

Как узнать размер буфера ядра?

Добавлено: 27 мар 2007, 12:30
Gekt0r
В ядре есть кольцевой буфер, куда пишется информация функцией printk. Размер этого буфера - LOG_BUF_LEN, эта переменная определена в файле printk.c. Во всех доках написано, что на ядрах 2.6 размер этого буфера по умолчанию - 16 Кб. Но этот размер может быть изменен при сборке ядра
Мне нужно узнать расмер кольцевого буфера ядра работающей системы.
Для этого я использовал команду dmesg, которая этот буфер читает. Опция -s указывает, сколько байтов читать. Я думал так: если указать большое число и пернаправить вывод dmesg в файл, то размер этого файла и будет равен размеру кольцевого буфера ядра.
Но при реализации возникли какие-то глюки.
Когда я, скажем писал:
dmesg -s 20000 > 1,
файл выходил размером 14008.
dmesg -s 17000 > 1,
размер файла - 11908
dmesg -s 100000 > 1,
размер файла - 45877.
dmesg -s 90000 > 1,
размер файла - 45877.

Почему он выходит разным? И реальный ли это размер буфера ядра?
И почему он не равен 16 Кб, как указано во всех доках? :shock:

Попробовав на другой системе, я получал размер файла 10894 вне зависимости от параметра, переданного dmesg.

Добавлено: 28 мар 2007, 11:45
Foxx
погрепайте kernel/printk.c на предмет функции do_syslog. у меня на операционном столе в настоящий момент лежит версия отдаленно напоминающая 2.6.21, в которой эта функция умеет при type=10 вернуть размер ring buffer'а. соответственно man 2 klogctl и вы, возможно, узнаете его размер. на более старые ядра не ручаюсь, но пробуйте.

Добавлено: 28 мар 2007, 22:47
exe
Не знаю поможет ли:

1. gzip -dc /proc/config.gz | grep CONFIG_LOG_BUF_SHIFT

В принципе LOG_BUF_LEN = (1 << CONFIG_LOG_BUF_SHIFT)

Добавлено: 29 мар 2007, 10:08
Gekt0r
exe, не помогло...
Foxx, классно)) Получилось)) Блин, я ориентировался на man с opennet.ru, а там ничего не говорится про type=10) Помогли исходники)

Спасибо всем за советы!