Использование памяти модулем ядра

При попытке оценить объем памяти, потребляемой модулем ядра (обычно драйверами устройств), я попытался использовать утилиту size, которая выдавала размер областей статической памяти файлов .ko ( .bss, . данные, .текст и т. д.). Поэтому я ожидал, что сумма этих значений будет точно равна выходным данным команды lsmod сразу после вставки модуля.

В функции init() не выполняется динамическое выделение памяти (kmalloc или vmalloc), чтобы гарантировать, что это не вызывает разницы. Так почему же возникает несоответствие?

Любопытно, что несоответствие в большинстве случаев оказывалось фиксированной суммой!!

Выходные данные команды перечислены ниже.

размер chardev.ko

text    data     bss     dec     hex   filename
172     448    1024016 1024636  fa27c chardev.ko

lsmod

Module  Size    Used by    Tainted: P
chardev 1025040 0 - Live   0xc009d000

person AIB    schedule 19.03.2009    source источник
comment
Если вы сделали измерения, вы, вероятно, должны предоставить их.   -  person unwind    schedule 19.03.2009
comment
Пожалуйста, документируйте вопрос больше.   -  person Wadih M.    schedule 19.03.2009
comment
Да, пожалуйста, перечислите модули. Также было бы полезно знать, какой тип отладки настроен в вашем ядре, это может быть просто накладные расходы на отладку.   -  person Tim Post♦    schedule 20.03.2009
comment
lsmod будет отображать значения в размерах страниц. size перечисляет их по тому, с чем выровнены разделы ELF. Вы не можете выделить меньше страницы в ядре. Эта разница в размере не так уж велика 1025040-1024636=404 байта.   -  person artless noise    schedule 22.01.2013


Ответы (3)


Вы упомянули, что в функции init не выполняется выделение памяти, но учитываются ли при этом такие вызовы, как register_chrdev(9), которые выделяют память внутри экземпляра устройства? Комментарий о том, что это постоянная разница, заставляет меня задуматься, может ли это быть причиной.

person ctuffli    schedule 24.03.2009
comment
Да, похоже, это так. - person AIB; 26.03.2009

Может функции, используемые модулем, засчитываются в размер модуля? Пытаться

cat /proc/kallsyms | grep module_name

Разница между двумя размерами составляет 404. Текст + данные + 404 = 1024. Может быть, это какая-то проблема детализации? Я не знаю, как размер рассчитывается внутри ядра...

Однако код ядра и данные размещаются с использованием динамической памяти. А kmalloc использует предварительно выделенный блок памяти, поэтому вполне вероятно, что при выделении разделов кода и данных происходит некоторое округление.

Попробуйте увеличить размер разделов данных и посмотрите, сообщил ли lsmod об изменении размера.

person shodanex    schedule 19.03.2009
comment
Он не дал никакой информации о размере. Вот o/p # cat /proc/kallsyms | grep chardev 00000000 a chardev.c [chardev] c009d058 r $LC0 [chardev] c009d400 b p [chardev] c009d000 t cleanup_module [chardev] c009d008 t init_module [chardev] - person AIB; 20.03.2009

Без дополнительной информации я склонен предположить, что это накладные расходы на отладку. Я говорю соблазн, потому что у меня нет вашей конфигурации ядра.

person Tim Post♦    schedule 20.03.2009
comment
@tinkertim Не будет ли накладных расходов на отладку как по размеру, так и по lsmod? - person AIB; 20.03.2009
comment
@AIB, я думаю, что размер _init зависит от отладки, но только _после вставки модуля. Я могу ошибаться, я сейчас пытаюсь найти :) - person Tim Post♦; 20.03.2009