Выбрать главу

В случае программирования процесса это обычно не проблема, потому что процесс будет обычно выполняться только на одном CPU сразу[14]. Ядро, с другой стороны, может быть вызвано различными процессами, работающими на различных CPU.

В версии 2.0.x, это не проблема, потому что все ядро находится в одном большом spinlock. Это означает что, если один CPU работает с ядром, и другой CPU хочет обратиться к ядру, например из-за системного вызова, он должно ждать, до тех пор пока первый CPU завершит работу с ядром. Это делает Linux SMP безопасным[15], но неэффективным.

В версии 2.2.x, несколько CPU могут работать с ядром одновременно. Это авторы модуля должны знать. Я надеюсь, что смогу получить доступ к машине с несколькими процессорами, и следующая версия этой книги будет включать большее количество информации.

Общие ловушки

Прежде чем писать ядерные модули, надо учесть несколько важных моментов.

1. Использование стандартных библиотек. Вы не можете делать этого. В модуле, Вы можете использовать только функции, которые Вы можете увидеть в /proc/ksyms.

2. Запрет прерываний. Если Вы на краткое время запретите прерывания, ничего ужасного не произойдет. Но если забудете их разрешить, придется выходить из данной ситуации выключением питания.

Различия между версиями 2.0 и 2.2

Я не знаю, что все ядро достаточно хорошо документирует все изменения. В ходе преобразования примеров (или фактически, адаптации изменений Еммануела Папиракиса) я натолкнулся на следующие различия. Я привожу их все здесь вместе, чтобы помочь программистам, особенно тем, кто обучался на предыдущих версий этой книги и наиболее знакомы с методами, которые я использую, и преобразовываю в новую версию.

Дополнительный ресурс для людей, кто желают преобразоваться в 2.2, находится по адресу: http://www.atnf.csiro.au/~rgooch/linux/docs/porting-to-2.2.htm.

1. asm/uaccess.h: Если Вы нуждаетесь в put_user или get_user: Вы должны #include его.

2. get_user в версии 2.2: get_user получает указатель в памяти пользователя и переменную в памяти ядра, чтобы заполнить информацией. Причина для этого в том, что get_user, может теперь читать два или четыре байта одновременно, если переменная, которую мы читаем длиной два или четыре байта.

3. file_operations: Она теперь выполняет функцию flush между функциями open and close.

4. close в file_operations: В версии 2.2, функция close возвращает целое число, так что она может вернуть код ошибки.

5. read и write в file_operations: Изменились заголовки для этих функций. Они сейчас возвращают ssize_t вместо целого числа, и их список параметра различен. Inode больше не параметр, и с другой стороны смещение в файле.

6. proc_register_dynamic: Функция больше не существует. Вместо нее Вы вызываете proc_register и помещаете ноль в поле inode структуры.

7. Сигналы: Сигналы в структуре task больше не 32 разрядные целые числа, а массив _NSIG_WORDS целых чисел.

8. queue_task_irq: Даже если Вы хотите обратиться к запланированной задаче из внутреннего обработчика прерывания, Вы используете queue_task, а не queue_task_irq.

9. Параметры модуля: Вы объявляете параметры модуля как глобальные переменные. В 2.2 Вы должны также использовать MODULE_PARM, чтобы объявить их тип. Это большое усовершенствование, потому что позволяет модулю получать параметры строкового типа, которые начинаются с цифр.

10. Симметричная многозадачность: Ядро больше не заперто внутри одного огромного spinlock, что означает что два процессора могут одновременно обрабатывать разные части ядра. Модули должны знать о SMP.

Что дальше?

Я мог бы легко добавить еще несколько глав в эту книгу. Я мог бы добавить главу о создании новых файловых систем, или о добавлении новых стеков протоколов (как будто имеется потребность в такой главе: вы должны рыть под землей, чтобы найти стек протоколов, не поддерижаемый Linux). Я мог бы добавить объяснение ядерных механизмов, которых мы не коснулись, типа начальной загрузки или дискового интерфейса.

Однако, я выбрал не это. Моя цель состояла в том, чтобы обеспечить введение в тайны программирования модулей ядра и обучить общим методам для этой цели. Для людей, серьезно заинтересованных программированием ядра, я рекомендую список ресурсов на: http://jungla.dit.upm.es/~jmseyas/linux/kernel/hackers-docs.htm. Также, как сказал Linus, самый лучший путь состоит в том, чтобы прочитать исходный текст самостоятельно.

Если вы заинтересованы в большом количестве примеров коротких модулей, я рекомендую журнал "Phrack". Даже если вы не заинтересованы защитой, модули имеют хорошие примеры того, что Вы можете делать внутри ядра, и они достаточно короткие, чтобы не требовать слишком много усилий для понимания.

Я надеюсь, что я помог Вам в ваших попытках стать лучшим программистом. И, если Вы пишете полезные модули для ядра, я надеюсь, что Вы издаете их под GPL, так что я тоже смогу их использовать.

Goods and Services

Честно говоря, я так и не понял, что именно в данном разделе хотел сказать автор, так что привожу без перевода.

I hope nobody minds the shameless promotions here. They are all things which are likely to be of use to beginning Linux Kernel Module programmers.

Получение книги в бумажном виде

Издательство Coriolis group собиралось печатать эту книгу летом 1999 года. Правда, на английском языке. Попробуйте ее найти, если считаете нужным иметь бумажную копию.

Поблагодарите автора

Это свободно распространяемый документ. Вы не имеете никаких обязательств кроме указанных GNU Public License (GPL) (Приложение   E). Однако, если Вы считаете нужным как-то отблагодарить за получение этой книги, имеется несколько способов, которые Вы могли бы использовать.

• Пошлите мне открытку по адресу:

Ori Pomerantz

Apt. #1032

2355 N Hwy 360

Grand Prairie

TX 75050

USA

Если Вы хотите получить благодарность, включите ваш адрес электронной почты.

• Жертвуйте деньги, или еще лучше, время, на Свободное Программистское Сообщество. Пишите программы или документы и издавайте их по GPL. Обучите другие людей, как использовать свободное программное обеспечение типа Linux или Perl.

• Объясните людям, что нередко эгоизм совместим с проживанием в обществе или с помощью другим людям. Я писал этот документ, веря публикации в то, что он будет опубликован и немало принесет мне в будущем. В то же самое время, я написал книгу, которая помогает Вам. Не забудьте, что счастливые люди обычно более полезны для себя чем несчастные люди, и способные люди лучше, чем люди низкой способности. 

• Будьте счастливы. Если я когда-либо встречусь с Вами, это сделает встречу лучше для меня, а Вас более полезными для меня ; -).

Лицензия фонда GNU (The GNU General Public License)

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

Printed below is the GNU General Public License (the GPL or copyleft ), under which this book is licensed.

вернуться

14

Исключительная ситуация: threaded-процессы, которые могут выполняться на нескольких CPU сразу.

вернуться

15

Значение безопасно, чтобы использовать с SMP.