Linux Device Drivers 3 / Драйверы устройств Линукс (третье издание): 2.5. Таблица символов ядра
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
2.5. Таблица символов ядра ximen 21.10.10 в 14:08 |
|
|
Мы рассмотрели, как insmod разрешает неопределённые символы с помощью таблицы общих символов ядра. Таблица содержит адреса глобальных элементов, функций и переменных, необходимых для реализации модульных драйверов. После загрузки модуля любой символ, экспортируемый модулем, становится частью таблицы символов ядра. В простом случае модуль реализует всю необходимую функциональность сам без необходимости экспортировать какие-либо символы. Однако вам нужно экспортировать символы, чтобы другие модули могли получить выгоду от их использования. ximen 26.10.10 в 12:14 |
||
|
Новый модуль может использовать символы экспортированные в модуль и вы можете составлять стек новых модулей в списке других модулей. Стекинг модулей также осуществлен в главном потоке дерева исходников ядра: файловая система msdoc полагается на символы экспортированных в модуль fat а каждый (input) подключаемое стек модулей USB устройства на usbcore и input модули. hardorsoft 28.10.10 в 23:18 Новый модуль может использовать символы, экспортированные вашим модулем, и вы можете составлять стек новых модулей в списке других модулей. Создание стеков модулей входит в основу исходных кодов ядра, так например: файловая система msdos опирается на символы, экспортируемые модулем fat, а каждый модуль устройства ввода USB входит в стек usbcore и модулей ввода. victor8632 03.11.10 в 05:41 |
||
|
Стеки модулей полезны в комплексных проектах. Если новая выполненная абстракция в форме драйвера устройства она должна предлагать подключение характерное для данного устройства. На пример, набор драйверов video-for-linux можно разделить на общий модуль который вызывает использованные символы драйверов устройств низкого уровня для данного аппаратного обеспечения. Соответственно ваша установка, вы загружаете общий video модуль, и особенный модуль для установленного аппаратного обеспечения. Поддержка параллельных портов и широкого круга прикладных устройств управляемых таким же образом, как и USB подсистема ядра. Стекинг подсистемы параллельного порта показана на Рисунке 2-2; стрелки показывают связи между модулями и программируемым интерфейсом ядра. hardorsoft 28.10.10 в 23:19 Стеки модулей часто используются в комплексных проектах. Если новая абстракция воплощается в виде драйвера устройства, она может использоваться в виде плагина для конкретных аппаратных реализаций. Например, в наборе драйверов video-for-linux есть общий модуль, который экспортирует символы, используемые низкоуровневыми драйверами конкретных устройств. Соответственно во время установки у вас, вы загружаете основной видео модуль и специальный модуль для установленного у вас аппаратного обеспечения. Поддержка параллельных портов и широкий спектр присоединяемых устройств осуществляется таким же образом, как USB подсистемы ядра. Организация стека подсистемы параллельного порта представлена на рисунке 2-2; стрелки показывают связи между модулями и программируемым интерфейсом ядра. victor8632 03.11.10 в 05:56 |
||
|
Рисунок 2-2. Стекинг модулей драйвера параллельного порта. hardorsoft 28.10.10 в 23:19 |
||
|
Когда используемые стекированные(?) модули полезно знать об утилите modprobe. Как мы говорили раньше, функции modprobe делают в основном тоже что и insmod, но также загружают любые другие модули которые необходимы для модуля который вы хотите загрузить. Так, одна команда modprobe может иногда перемещать несколько вызовов insmod (хотя, вы можете если спокойно использовать insmod во время загрузки ваших модулей из текущей директории, потому что modeprobe просматривает только стандартные директории установленных модулей). hardorsoft 28.10.10 в 23:25 Полезно вспомнить об утилите modprobe, говоря об использовании стеков модулей. Как было описано ранее, функции modprobe почти такие же, как и у insmod, но она также загружает любые другие модули, необходимые для модуля, который мы хотим загрузить. Таким образом, одна команда modprobe иногда может заменить несколько вызовов insmod (хотя, вы можете спокойно использовать insmod для загрузки ваших модулей из текущего каталога, потому что modprobe просматривает каталоги только стандартно установленных модулей). victor8632 03.11.10 в 06:21 |
||
|
Использование стеккинга для разделения модуля на множество слоев может помочь сократить время разработки упрощением каждого слоя. Это похожее определение между механизмом и политикой которая обсуждалась в Главе 1. hardorsoft 28.10.10 в 23:32 Использование стеккинга для разделения модуля на множество слоев может помочь сократить время разработки упрощением каждого слоя. Это похоже на разделение между механизмом и политикой, что обсуждалось в главе 1. victor8632 03.11.10 в 05:53 |
||
|
Заголовочные файлы ядра Linux обеспечивают удобный способ управления видимостью ваших символов, уменьшая замусоренность пространства имён (заполнение пространства имён именами, которые могут конфликтовать с другими символами, определёнными где-либо ещё в ядре) и поощряя надлежащее сокрытие информации. Если вашему модулю нужно экспортировать символы для использования другими модулями, следует использовать следующие макросы: ximen 25.10.10 в 12:13 |
||
|
<code> ximen 21.10.10 в 14:08 |
||
|
Оба этих макроса делают указанный символ доступным за пределами модуля. Вариант с _GPL делает символ доступным только для модулей с лицензией GPL. Символы должны экспортироваться в глобальной части файла модуля, за пределами функций, т.к. макрос разворачивается в объявление особой переменной, которая должна быть доступна глобально. Эта переменная хранится в специальной части исполняемого файла модуля ("секции ELF-файла"), которая используется ядром во время загрузки для поиска переменных, экспортируемых модулем. Заинтересованные читатели могут найти подробности в <module.h>, хотя это не обязательно. ximen 26.10.10 в 11:22 |
