понедельник, 18 октября 2010 г.

2.2 Модуль "Привет мир" (!)

Многие книги по программированию начинаются с примера «Привет, мир!», как способ показать самую простую программу. Эта книга имеет дело с модулями ядра больше чем с программами; так для нетерпеливого читателя, следующий код целый модуль «привет, мир.»:

#include init.h>
#include module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, world\n");
}
module_init(hello_init);
module_exit(hello_exit);

Этот модуль определяет две функции, первая вызывается когда модуль загружается в ядро (hello_init), а вторая тогда когда модуль удаляется (выгружается) (hello_exit). Строки module_init и module_exit используют особенный макрос ядра который показывает роль этих двух функций. Другой особенный макрос (MODULE_LICENSE) используется для того чтобы сообщить ядру, что этот модуль использует свободую лицензию, без этой декорации ядро выдать предупреждающее сообщение во время загрузки ядра.

Функция printk определена в ядре Линукс и делает доступными модули, ведет себя подобно функции printf стандартной библиотеки языка Си. Ядру необходимо иметь свою собственную функцию вывода на печать потому что оно запускается без поддержки библиотеки языка Си. Модуль может сделать вызов printk потому что после как insmod загрузится, модуль связан с ядром и может иметь доступ к публичным символам ядра (функции и переменные, как подробно рассматриваются в следующем разделе). Строка KERN_ALERT приоритетное сообщение. Мы точно определяем высший приоритет в этом модуле, потому что сообщение с приоритетом по умолчанию может не показать ничего полезного, зависит от версии запущенного ядра, версии демона klogd и вашей конфигурации. Сейчас вы можете игнорировать этот подход; мы дадим объяснение этому в главе 4.
[1] Приоритет это просто строка, наример <1>, которая присоединяется к началу строки в printk. Заметьте, что запятая после KERN_ALERT не нужна; запятая здесь это распространённая ошибка, которая, к счастью, отлавливается компилятором.

Вы можете протестировать получившийся модуль при помощи утилит insmod и rmmod, как это показано ниже. Имейте в виду, что загружать и выгружать модули ядра может только администратор (superuser).

% make
make[1]: Entering directory `/usr/src/linux-2.6.10'
CC [M] /home/ldd3/src/misc-modules/hello.o
Building modules, stage 2.
MODPOST
CC /home/ldd3/src/misc-modules/hello.mod.o
LD [M] /home/ldd3/src/misc-modules/hello.ko
make[1]: Leaving directory `/usr/src/linux-2.6.10'
% su
root# insmod ./hello.ko
Hello, world
root# rmmod hello
Goodbye world
root#

Пожалуйста, имейте также в виду, что для того чтобы приведенная выше последовательность команд работала, вы должны иметь предварительно сконфигурированное и выстроенное дерево ядра, местоположение которого сможет найти makefile (в показанном примере это каталог /usr/src/linux-2.6.10). Более подробно о создании модулей мы расскажем в разделе 2.4.
В зависимости от механизма доставки сообщений вашей системы, попытка вывода строки может привести к различным результатам. В частности, предыдущий дамп экрана был снят с текстовой консоли; если вы запустите insmod и rmmod в эмуляторе терминала под оконной графической системой, на экране вы не увидите ничего. Сообщение попадет в один из файлов системных журналов, такой как /var/log/messages (имя файла может быть другим в зависимости от используемого дистрибутива Linux). Механизм, используемый для доставки сообщений ядра, описан в главе 4.
Как видите, написать модуль ядра не так уж и сложно, как вы, наверное, себе представляли, по крайней мере, пока от модуля не требуется делать что-нибудь стоящее. Сложность состоит в том, чтобы понять, как должно работать ваше устройство и как увеличить производительность его работы. В этой главе мы углубимся в общие вопросы модульности, а конкретные вопросы, связанные с работой устройств, оставим для последующих глав.

Переведено на сайте www.notabenoid.com
http://notabenoid.com/book/11832/38201
Внимание! Этот перевод, возможно, ещё не готов,
так как модераторы установили для него статус
"идёт перевод"

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.