Рівень подій ядра

(kernel event layer) – це підсистема, яка дозволяє передавати інформацію про різні події з ядра в простір користувача і реалізована, як ви вже, напевно, здогадуєтеся, на базі обєктів kobject Після випуску ядра версії 260 стало ясно, що необхідний механізм для відправлення повідомлень з ядра в простір користувача, зокрема для настільних робочих компютерів, що дозволить зробити такі системи більш функціональними, а також краще використовувати асинхронну обробку Ідея полягала в тому, що ядро ​​буде поміщати виникають події в стек Наприклад, Жорсткий диск переповнений , Процесор перегрівся , Розділ диска змонтований , На горизонті зявився піратський корабель (Останнє, звичайно, жарт)

Перші реалізації підсистеми подій ядра зявилися незадовго до того, як ця підсистема стала тісно повязаної з обєктами kobjec t і файлової системою sysfs У результаті такого звязку реалізація вийшла досить красивою У моделі рівня подій ядра, події представляються у виглядісигналів,які надсилаються обєктами, зокрема обєктами типу kobject Так як обєкти відображаються на елементи каталогів файлової системи sysfs, то джереламиподій є певні елементи шляху на файлової системі sysfs Наприклад, якщо надійшла подія повязана з першим жорстким диском, то адресою джерела події є каталог / sys / block / hda Усередині ж ядра джерелом події є відповідний обєкт kobject

Кожному події присвоюється певна рядок символів, яка представляє сигнал і називається командою (verb) або дією (action) Цей рядок символів містить в собі інформацію про те, що саме сталося, наприклад зміна (modified) або размонтирование (unmounted)

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

Події ядра надходять з простору ядра в простір користувача через інтерфейс netlink Інтерфейс netlin k це спеціальний тип високошвидкісного мережевого сокета груповий передачі (multicast), який використовується для передачі повідомлень, повязаних з мережевою підсистемою Використання інтерфейсу netlin k дозволяє виконати обробку подій ядра за допомогою простих блокуючих викликів функцій для читання інформації з сокетів Завдання простору користувача-реалізувати системний процес-демон, який виконує прослуховування сокета, зчитує інформацію про всіх приходять події, обробляє їх і відправляє отримані повідомлення в системний стек простору користувача Одна з можливих реалізацій такого демона, працював у просторі користувача, – це D-BUS2 який також реалізує і системну шину повідомлень Таким чином, ядро ​​може подавати сигнали так само, як це роблять всі інші компоненти системи

Для відправки події в простір користувача код ядра повинен викликати функцію kobject_uevent ()

int kobject_uevent(struct kobject *kobj, enurn kobject_action action, struct attribute *attr)

Перший параметр вказує обєкт kobject, який є джерелом сигналу Відповідне подія ядра буде містити елемент шляху на файлової системі sysfs, повязаний з обєктом, згенерованого сигнал

Другий параметр дозволяє вказати команду або подія, яке описує сигнал Сгенерированное подія ядра буде містити рядок, яка відповідає номеру, переданому як значення параметра enurn kobject_action Замість того щоб безпосередньо передати рядок, тут використовується її номер, який має тип перерахування (enum) Це дає можливість більш строго виконати перевірку типів, змінити відповідність між номером рядка і самої рядком у майбутньому, а також зменшити кількість помилок і друкарських помилок Перерахування визначені у файлі і мають імена у форматі KOBJ_foo На момент написання книги були визначені наступні події: KOBJ_MOUNT, KOBJ_UNMOUNT, KOBJ_ADD, KOBJ_REMOVE і КОВJ_CHANGE Ці значення відображаються на рядки mount (Монтування), unmount (Размонтіроваиіе), add (Додавання), remove (Видалення) і change (Зміна) відповідно Допускається додавання нових значень подій, якщо існуючих значень недостатньо

Останній параметр – опціональний покажчик на структуру attribute Цей параметр можна трактувати як додаткову інформацію (payload) про подію Якщо тільки одного значення події недостатньо, то подія може надати інформацію про те, в якому файлі файлової системи sysfs містяться додаткові дані

2 Більш детальну інформацію ю про демона D-BUS можна знайти на сайті http://dbusfreedesktoporg/

Розглянута функція використовує динамічне виділення памяті і тому може переходити в стан очікування Існує атомарна версія розглянутої функції, яка ідентична їй по всіх, крім того що при виділенні використовує прапор GFP_ATOMIC

int kobject_uevent_atomic (struct kobject *kobj, enum kobject_action action, struct attribute *attr)

По можливості необхідно використовувати стандартний інтерфейс без атомарного виділення памяті Параметри цих функцій і їх зміст – ідентичні

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

Обидві розглянуті функції визначені у файлі lib / kobject_uevent с і оголошені у файлі

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

*

*