Експортовані символи

При завантаженні модулі динамічно компонуються з ядром Так само як і у випадку динамічно завантажуваних бінарних файлів простору користувача, в коді модулів можуть викликатися тільки ті функції ядра (основного способу або інших модулів), які явноекспортуються для використання У ядрі експортування здійснюється за допомогою спеціальних директив EXPORT_SYMBOL () і EXPORT_ SYMBOL_GPL ()

Функції, які експортуються, доступні для використання модулями Функції, які не експортуються, не можуть бути викликані з модулів Правила компонування і виклику функцій для модулів значно більш суворі, ніж для основного образу ядра Код ядра може використовувати будь-які інтерфейси ядра (крім тих, що визначені з ключовим словом static), тому що код ядра компонується в один виконуваний образ , звичайно, теж не повинні визначатися як static

Набір символів ядра, що експортуються, називається експортним інтерфейсом ядра або навіть (тут не потрібно дивуватися) API ядра

Експортувати символи просто Після того як функція визначена, необхідно викликати директиву EXPORT_SYMBOL ()

/*

* Get_pirate_beard_color – повернути значення кольору бороди поточного

* Пірата pirate – це глобальна змінна, доступна з даної

* Функції кольору визначені у файлі

*/

int get_pirate_beard_color(void)

{

return pirate-&gtbeard-&gtcolor

}

EXPORT_SYMBOL(get_pirate_beard_color)

Припустимо, що функція get_pirate_beard_color () оголошена в заголовному файлі і її може використовувати будь-який модуль

Деякі розробники хочуть, щоб їх інтерфейси були доступні тільки для модулів з ліцензією GPL Така можливість забезпечується компоновщиком ядра за допомогою макросу MODULE_LICENSE () Якщо є бажання, щоб розглянута функція була доступна тільки для модулів, які помічені як відповідні ліцензії GPL, то експортувати функцію можна таким чином

EXPORT_SYMBOL_GPL(get_pirate_beard_color)

Якщо код ядра конфігурується для компіляції у вигляді модуля, то необхідно гарантувати, що всі використовувані інтерфейси експортуються В іншому випадку будуть виникати помилки компоновщика і завантажуваний модуль не працюватиме

Навколо модулів

У цьому розділі були розглянуті особливості написання, складання, завантаження і вивантаження модулів ядра Ми обговорили, що таке модулі і яким чином ядро ​​операційної системи Linux, незважаючи на те що воно є монолітним, може завантажувати код динамічно Були також розглянуті параметри модулів і експортуються символи На прикладі уявного модуля ядра (драйвера пристрою) управління вудкою був показаний процес написання модуля і процес додавання до нього різних можливостей, таких як зовнішні параметри

У наступному розділі будуть розглянуті обєкти kobjec t і файлова система sysfs, які є основним інтерфейсом до драйверів пристроїв і, отже, до модулів ядра

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*