Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Модули ядра 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 

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


Предыдущий раздел: Оглавление Следующий раздел:
Загрузка и исполнение   Вывод диагностики модуля