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

UnixForum





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

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Модули ядра Linux
Назад Отладка в ядре Вперед

Отдельные отладочные приёмы и трюки

Здесь мы перечислим некоторые приёмы применяемые в процессе отладки, которые сложились и показали свою продуктивность в процессе работ над реальными разработками в области модулей ядра.

Модуль исполняемый как разовая задача

Один из продуктивных трюков, который уже неоднократно применялся по ходу всего рассмотрения ранее, есть сознательное написание модуля, возвращающего ненулевое значение из инициализирующей функции, который вовсе и «не собирается» загружаться. Такой модуль выполняется однократно, подобно пользовательскому процессу, но отличаясь тем, что делает он это в супервизорном режиме и в адресном пространстве ядра. Пример такого простейшего модуля приводится в архиве simple-debug.tgz):

md.c :

	#include <linux/module.h>
	
	static int __init hello_init( void ) {
	   extern int sys_close( int fd );
	   void* Addr;
	   Addr = (void*)sys_close;
	   printk( KERN_INFO "sys_close address: %p\n", Addr );
	   return -1;
	}
	
	module_init( hello_init );

Такой модуль в принципе не может загрузиться, так как он возвращает -1 (или точнее: не 0). В этой связи у модуля даже нет процедуры завершения (она ему не нужна):

$ sudo /sbin/insmod ./md.ko

	insmod: error inserting './md.ko': -1 Operation not permitted

Но такой модуль начинает выполняться (hello_init()), выполняться в контексте ядра, и производит диагностический вывод:

$ dmesg | tail -n2

	md: module license 'unspecified' taints kernel.
	sys_close address: c047047a

И в таком качестве подобный модуль (который не загрузится и не навредит) становится интересным средством отладки, особенно на начальных этапах отработки, когда можно проверить все инициализированные значения модуля.


Предыдущий раздел: Оглавление Следующий раздел:
Отладка в виртуальной машине   Тестирующий модуль