Читать «Энциклопедия разработчика модулей ядра Linux» онлайн - страница 2
Ори Померанц
1. Поддержка версии 2.2 ядра во всех главах.
2. Исходный код примеров для разных версий ядра, 2.1.
3. Разница между версиями 2.0 и 2.2, A.
4. Модули ядра в нескольких файлах исходников, 1.2.
5. Предложение, как избежать беспорядка с системными вызовами при выдаче команды rmmod, 7.
Благодарности
Я хотел бы благодарить Weiss за многие полезные идеи и обсуждения, также как и за поиск ошибок внутри этого документа перед публикацией. Конечно, любые оставшиеся ошибки только моя вина.
TEX скелет для этой книги был бесстыдно захвачен из руководства `Linux Installation and Getting Started', где работа в TEX была выполнена Matt Welsh.
Моя благодарность Linus Torvalds, Richard Stallman и всем другим людям, кто сделали возможным для меня выполнить операционную систему высокого качества на моем компьютере и получить ее исходный текст, как нечто само собой разумеющееся (да, право, зачем я говорю это?).
Благодарности к версии 1.0.1
Я не могу внести в список каждого, кто послал по e-mail мне сообщение, и если я не вписал именно Вас, я приношу извинения заранее. Следующие люди были особенно полезны:
• Frodo Looijaard из Нидерландов За сервер с кучей информации и полезных советов по ядрам версий 2.1.x.
• Stephen Judd из Новой Зеландии За правку орфографии.
• Magnus Ahltorp из Швеции За исправления, касательно разницы между символьными и блочными устройствами.
Благодарности к версии 1.1.0
• Emmanuel Papirakis из Квебека, Канада за перенос всех примеров в версию 2.2 ядра.
• Frodo Looijaard из Нидерландов за сообщение как создать многофайловый модуль ядра (1.2).
Конечно, любые оставшиеся ошибки мои собственные, и если Вы думаете, что они делают книгу непригодной, требуйте полного возврата денег, которые Вы заплатили за книгу.
Hello, world
Традиционно все учебники программирования начинаются с программы "Hello, world!". Я не знаю, что случается с людьми, которые порывают с этой традицией, и думаю, что безопаснее не выяснять.
Модуль ядра (в дальнейшем просто модуль для краткости) должен иметь по крайней мере две функции: init_module, которая вызывается, когда модуль вставляется в ядро и cleanup_module, которая вызывается, когда он удаляется. Обычно init_module регистрирует драйвер для каких-либо действий с ядром или заменяет одну из ядерных функций собственным кодом (обычно код делает что-то и затем вызывает первоначальную функцию). Функция cleanup_module, как предполагается, отменяет все, что сделано init_module, так что модуль может быть выгружен безопасно.
hello.c
/* hello.c
* Copyright (C) 1998 by Ori Pomerantz
*
* "Hello, world" - версия для модуля ядра.
*/
/* The necessary header files */
/* Standard in kernel modules */
#include <linux/kernel.h>
/* We're doing kernel work */
#include <linux/module.h>
/* Specifically, a module */
/* Deal with CONFIG_MODVERSIONS */
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif
/* Initialize the module */
int init_module() {