Модуль “Hello, World!”

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

Може здатися банальним, але мати можливість написати програму, яка виводить повідомлення Hello World”, І не зробити цього просто смішно Отже, леді і джентльмени, модуль  &quotHello, World&quot.

/*

* Helloс модуль ядра Hello, World

/*

#include &ltlinux/inith&gt

#include &ltlinux/moduleh&gt

#include &ltlinux/kernelh&gt

/*

* Hello_init функція ініціалізації, викликається при завантаженні модуля,

* У разі успішного завантаження модуля повертає значення нуль,

* І ненульове значення в іншому випадку

*/

static int hello_init(void)

{

printk(KERN_ALERT &quotI bear a charmed life\n&quot)

return 0

}

/*

* Hello_exit функція завершення, викликається при вивантаженні модуля

*/

static void hello_exit (void)

{

printk(KERN_ALERT &quotOut, out, brief candle\n&quot)

}

module_init(hello_init)

module_exit(hello_exit)

MODULE_LICENSE{&quotGPL&quot) MODULE_AUTHOR(&quotShakespeare&quot)

Це найпростіший модуль ядра, який тільки може бути Функція hello _ ini t () реєструється за допомогою макросу module_ini t () в якості точки входу в модуль Вона викликається ядром при завантаженні модуля Виклик module_ini t () – це не виклик функції, а макрос, який встановлює значення свого параметра в якості функції ініціалізації Всі функції ініціалізації повинні соотпетствовать наступного прототипу

int my_init(void)

Так як функція ініціалізації рідко викликається за межами модуля, її зазвичай не потрібно експортувати і можна оголосити з ключовим словом static

Функції ініціалізації повертають значення тина int Якщо ініціалізація (або те, що робить функція ініціалізації) пройшла успішно, то функція повинна повернути значення нуль У випадку помилки повертається ненульове значення

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

Функція hello_exi t () реєструється в якості точки виходу з модуля за допомогою макросу module_exi t () Ядро викликає функцію hello_exi t (), коли модуль видаляється з памяті Завершальна функція повинна виконати очищення ресурсів, гарантувати, що апаратне забезпечення знаходиться в несуперечливою стані, і тд Після того як ця функція завершується, модуль вивантажується

Завершальна функція повинна відповідати наступному прототипу

void my_exit(void)

Так само як і у випадку функції ініціалізації, її можна оголосити як static

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

Макрос MODULE_LICENSE () дозволяє вказати ліцензію на право копіювання модуля Завантаження в память модуля, для якого ліцензія не відповідає GPL, призведе до встановлення в ядрі прапора tainte d (буквально, зіпсоване) Цей прапор служить для інформаційних цілей, крім того, багато розробників приділяють менше уваги повідомленнями про помилки, в яких вказаний цей прапор Більш того, модулі, у яких ліцензія не відповідає GPL, не можуть використовувати символи, які служать тільки для GPL (Див розділ експортуються символи нижче в цьому розділі)

Нарешті, макрос MODULE_AUTHOR () дозволяє вказати автора модуля Значення цього макросу служить тільки для інформаційних цілей

Джерело: Лав, Роберт Розробка ядра 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>

*

*