понедельник, 18 октября 2010 г.

2.5 Таблица символов ядра.

Перевод с английского на русский

2.5. Таблица символов ядра

Мы рассмотрели, как insmod разрешает неопределённые символы с помощью таблицы общих символов ядра. Таблица содержит адреса глобальных элементов, функций и переменных, необходимых для реализации модульных драйверов. После загрузки модуля любой символ, экспортируемый модулем, становится частью таблицы символов ядра. В простом случае модуль реализует всю необходимую функциональность сам без необходимости экспортировать какие-либо символы. Однако вам нужно экспортировать символы, чтобы другие модули могли получить выгоду от их использования.

Новый модуль может использовать символы, экспортированные вашим модулем, и вы можете составлять стек новых модулей в списке других модулей. Создание стеков модулей входит в основу исходных кодов ядра, так например: файловая система msdos опирается на символы, экспортируемые модулем fat, а каждый модуль устройства ввода USB входит в стек usbcore и модулей ввода.

Стеки модулей часто используются в комплексных проектах. Если новая абстракция воплощается в виде драйвера устройства, она может использоваться в виде плагина для конкретных аппаратных реализаций. Например, в наборе драйверов video-for-linux есть общий модуль, который экспортирует символы, используемые низкоуровневыми драйверами конкретных устройств. Соответственно во время установки у вас, вы загружаете основной видео модуль и специальный модуль для установленного у вас аппаратного обеспечения. Поддержка параллельных портов и широкий спектр присоединяемых устройств осуществляется таким же образом, как USB подсистемы ядра. Организация стека подсистемы параллельного порта представлена на рисунке 2-2; стрелки показывают связи между модулями и программируемым интерфейсом ядра.


Рисунок 2-2. Стекинг модулей драйвера параллельного порта.

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

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

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

EXPORT_SYMBOL(name);
EXPORT_SYMBOL_GPL(name);



Оба этих макроса делают указанный символ доступным за пределами модуля. Вариант с _GPL делает символ доступным только для модулей с лицензией GPL. Символы должны экспортироваться в глобальной части файла модуля, за пределами функций, т.к. макрос разворачивается в объявление особой переменной, которая должна быть доступна глобально. Эта переменная хранится в специальной части исполняемого файла модуля ("секции ELF-файла"), которая используется ядром во время загрузки для поиска переменных, экспортируемых модулем. Заинтересованные читатели могут найти подробности в , хотя это не обязательно.

Переведено на сайте www.notabenoid.com
http://notabenoid.com/book/11832/38205
Внимание! Этот перевод, возможно, ещё не готов,
так как модераторы установили для него статус
"перевод редактируется"

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.