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

UnixForum





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

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

Обсуждение

Мы только что создали первый свой загружаемый модуль ядра. К этому времени можно взять на заметку следующее:

1. Программирование модуля ядра ничем принципиально не отличается от программирования в пространстве пользователя. Однако, для обеспечения функциональности модуля мы используем другой набор API (printk(), например, вместо привычного printf()). Такая дуальность вызовов будет наблюдаться практически для всех разделов API (управление памятью, примитивы синхронизации, ...), но имена и форматы вызовов API ядра будут отличаться. Относительно API пространства пользователя существуют стандарты (POSIX и др.) и они хорошо описаны в литературе. API пространства ядра плохо описаны, и могут существенно изменяться от одной версии ядра к другой. Поиск адекватных вызовов API для текущей версии ядра и есть одна из существенных трудностей программирования модулей ядра Linux. Мы ещё неоднократно вернёмся к этим вопросам по ходу дальнейшего текста.

2. Обратите внимание, что в командах загрузки модуля мы всегда записываем:

# insmod ./hello_printk.ko

а не :

# insmod hello_printk.ko

Это происходит потому, что в UNIX текущий рабочий каталог не включается (по умолчанию) в список путей переменной $PATH. Можно ли это изменить? Можно, например так:

$ export PATH=./:$PATH

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

Ещё одна особенность (которая досаждает поначалу при работе с модулями): при установке модуля мы говорим:

# insmod ./hello_printk.ko

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

# rmmod hello_printk

- то есть, без путевого имени и расширения имени. Это связано с тем, что в этих родственных командах мы под подобными написаниями указываем совершенно разные сущности: при установке — имя файла из которого должен быть установлен модуль ядра, а при выгрузке — имя модуля в RAM пространства ядра, которое (по написанию) только совпадает с именем файла.


Предыдущий раздел: Оглавление Следующий раздел:
Основные ошибки модуля   Архитектура и вокруг...