Библиотека сайта rus-linux.net
Цилюрик О.И. Модули ядра Linux | ||
Назад | Вперед |
Структура модуля
Относительно структуры модуля ядра мы можем увидеть, для начала, что собранный нами модуль является объектным файлом ELF формата:
$ file hello_printk.ko
hello_printk.ko: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
Всесторонний анализ объектных файлов производится утилитой objdump, имеющей множество опций в зависимости от того, что мы хотим посмотреть:
$ objdump
Usage: objdump <option(s)> <file(s)> Display information from object <file(s)>. ....
Структура секций объектного файла модуля (показаны только те, которые могут нас заинтересовать — теперь или в дальнейшем):
$ objdump -h hello_printk.ko
hello_printk.ko: file format elf32-i386 Sections: Idx Name Size VMA LMA File off Algn ... 1 .text 00000000 00000000 00000000 00000058 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 2 .exit.text 00000015 00000000 00000000 00000058 2**0 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 3 .init.text 00000011 00000000 00000000 0000006d 2**0 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE ... 5 .modinfo 0000009b 00000000 00000000 000000a0 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 6 .data 00000000 00000000 00000000 0000013c 2**2 CONTENTS, ALLOC, LOAD, DATA ... 8 .bss 00000000 00000000 00000000 000002a4 2**2 ALLOC ...
Здесь секции:
- .text — код модуля (инструкуции);
- .init.text,.exit.text — код инициализации модуля и завершения, соответственно;
- .modinfo — текст макросов модуля;
- .data — инициализированные данные;
- .bss — не инициализированные данные (Block Started Symbol);
Ещё один род чрезвычайно важдной информации о модуле — это список имён модуля (в том числе и экспортируемых модулем, о чём мы поговорим позже), эту информацию извлекаем так:
$ objdump -t hello_printk.ko
hello_printk.ko: file format elf32-i386 SYMBOL TABLE: ... 00000000 l F .exit.text 00000015 hello_exit 00000000 l F .init.text 00000011 hello_init 00000000 l O .modinfo 00000026 __mod_author5 00000028 l O .modinfo 0000000c __mod_license4 ...
Здесь хорошо видны имена (функций) описанных в коде нашего модуля, с ними вместе указывается имя секции, в которой находятся эти имена.
Ещё один альтернативный инструмент детального анализа объектной структуры модуля (он даёт несколько иные срезы информации):
$ readelf -s hello_printk.ko
Symbol table '.symtab' contains 35 entries: Num: Value Size Type Bind Vis Ndx Name ... 22: 00000000 21 FUNC LOCAL DEFAULT 3 hello_exit 23: 00000000 17 FUNC LOCAL DEFAULT 5 hello_init 24: 00000000 38 OBJECT LOCAL DEFAULT 8 __mod_author5 25: 00000028 12 OBJECT LOCAL DEFAULT 8 __mod_license4 ...
Примечание: Здесь самое время отвлечься и рассмотреть вопрос, чтобы к нему больше не обращаться: чем формат модуля *.ko отличается от обыкновенного объектного формата *.o (тем более, что второй появляется в процессе сборки модуля как промежуточный результат):
$ ls -l *.o *.ko
-rw-rw-r-- 1 olej olej 92209 Июн 13 22:51 hello_printk.ko -rw-rw-r-- 1 olej olej 46396 Июн 13 22:51 hello_printk.mod.o -rw-rw-r-- 1 olej olej 46956 Июн 13 22:51 hello_printk.o
$ modinfo hello_printk.o
filename: hello_printk.o author: Oleg Tsiliuric <olej@front.ru> license: GPL
$ modinfo hello_printk.ko
filename: hello_printk.ko author: Oleg Tsiliuric <olej@front.ru> license: GPL srcversion: 83915F228EC39FFCBAF99FD depends: vermagic: 2.6.32.9-70.fc12.i686.PAE SMP mod_unload 686
Легко видеть, что при сборке к файлу модуля добавлено несколько внешних имён, значения которых используются системой для контроля возможности корректной загрузки модуля.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Загрузка и исполнение | Вывод диагностики модуля |