Linux Device Drivers 3 / Драйверы устройств Линукс (третье издание): 2.2.Модуль привет мир
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
2.2 Модуль «Привет, мир!» hardorsoft 22.10.10 в 00:06 2.2 Модуль «Hello World!» dk14 05.12.11 в 00:45 |
|
|
Многие книги по программированию начинаются с примера «Привет, мир!», как способ показать самую простую программу. Эта книга имеет дело с модулями ядра больше чем с программами; так для нетерпеливого читателя, следующий код целый модуль «привет, мир.»: hardorsoft 22.10.10 в 00:06 |
||
|
#include init.h> hardorsoft 22.10.10 в 00:07 |
||
|
Этот модуль определяет две функции, первая вызывается когда модуль загружается в ядро (hello_init), а вторая тогда когда модуль удаляется (выгружается) (hello_exit). Строки module_init и module_exit используют особенный макрос ядра который показывает роль этих двух функций. Другой особенный макрос (MODULE_LICENSE) используется для того чтобы сообщить ядру, что этот модуль использует свободую лицензию, без этой декорации ядро выдать предупреждающее сообщение во время загрузки ядра. hardorsoft 22.10.10 в 00:07 |
+1 | |
|
Функция printk определена в ядре Линукс и делает доступными модули, ведет себя подобно функции printf стандартной библиотеки языка Си. Ядру необходимо иметь свою собственную функцию вывода на печать потому что оно запускается без поддержки библиотеки языка Си. Модуль может сделать вызов printk потому что после как insmod загрузится, модуль связан с ядром и может иметь доступ к публичным символам ядра (функции и переменные, как подробно рассматриваются в следующем разделе). Строка KERN_ALERT приоритетное сообщение. Мы точно определяем высший приоритет в этом модуле, потому что сообщение с приоритетом по умолчанию может не показать ничего полезного, зависит от версии запущенного ядра, версии демона klogd и вашей конфигурации. Сейчас вы можете игнорировать этот подход; мы дадим объяснение этому в главе 4. hardorsoft 22.10.10 в 00:07 |
||
|
[1] Приоритет это просто строка, наример <1>, которая присоединяется к началу строки в printk. Заметьте, что запятая после KERN_ALERT не нужна; запятая здесь это распространённая ошибка, которая, к счастью, отлавливается компилятором. ximen 22.10.10 в 12:57 |
||
|
Вы можете протестировать получившийся модуль при помощи утилит insmod и rmmod, как это показано ниже. Имейте в виду, что загружать и выгружать модули ядра может только администратор (superuser). victor8632 22.10.10 в 11:41 |
||
|
% make hardorsoft 22.10.10 в 03:36 |
||
|
Пожалуйста, имейте также в виду, что для того чтобы приведенная выше последовательность команд работала, вы должны иметь предварительно сконфигурированное и выстроенное дерево ядра, местоположение которого сможет найти makefile (в показанном примере это каталог /usr/src/linux-2.6.10). Более подробно о создании модулей мы расскажем в разделе 2.4. victor8632 22.10.10 в 11:56 |
||
|
В зависимости от механизма доставки сообщений вашей системы, попытка вывода строки может привести к различным результатам. В частности, предыдущий дамп экрана был снят с текстовой консоли; если вы запустите insmod и rmmod в эмуляторе терминала под оконной графической системой, на экране вы не увидите ничего. Сообщение попадет в один из файлов системных журналов, такой как /var/log/messages (имя файла может быть другим в зависимости от используемого дистрибутива Linux). Механизм, используемый для доставки сообщений ядра, описан в главе 4. victor8632 22.10.10 в 12:12 |
||
|
Как видите, написать модуль ядра не так уж и сложно, как вы, наверное, себе представляли, по крайней мере, пока от модуля не требуется делать что-нибудь стоящее. Сложность состоит в том, чтобы понять, как должно работать ваше устройство и как увеличить производительность его работы. В этой главе мы углубимся в общие вопросы модульности, а конкретные вопросы, связанные с работой устройств, оставим для последующих глав. victor8632 22.10.10 в 12:22 |
