Библиотека сайта rus-linux.net
Цилюрик О.И. Модули ядра 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 пространства ядра, которое (по написанию) только совпадает с именем файла.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Основные ошибки модуля | Архитектура и вокруг... |