Файлова система sysfs

– це віртуальна файлова система, яка існує тільки в оперативній памяті і дозволяє переглядати ієрархію обєктів kobject Вона дозволяє пользопателям переглядати топологію пристроїв операційної системи у вигляді простої файлової системи Атрибути обєктів kobjec t можуть експортуватися у вигляді файлів, які дозволяють зчитувати значення змінних ядра, а також опціонально записувати їх

Хоча спочатку метою створення моделі подання пристроїв був опис топології пристроїв системи для управління електроживленням, файлова система sysfs стала вдалим продовженням цієї ідеї Для того щоб спростити налагодження, розробник уніфікованої моделі пристроїв вирішив експортувати дерево пристроїв у вигляді файлової системи Таке рішення показало свою корисність спочатку в якості заміни файлів, повязаних з пристроями, які раніше експортувалися через файлову систему / ргос, а пізніше в якості потужного інструменту перегляду інформації про системну ієрархії обєктів Спочатку, до появи обєктів kobject, файлова система sysfs називалася driverfs Пізніше стало ясно – нова обєктна модель була б дуже до речі, і в результаті цього зявилася концепція обєктів kobject Сьогодні кожна система, на якій працює ядро ​​26, має підтримку файлової системи sysfs, і практично у всіх випадках ця файлова система монтується

Основна ідея роботи файлової системи sysfs – це привязка обєктів kobjec t до структури каталогів за допомогою поля dentry, яке є в структурі kobject Згадайте з матеріалу глави 12, Віртуальна файлова система , що структура dentr y використовується для представлення елементів каталогів Звязування обєктів з елементами каталогів виявляється в тому, що кожен обєкт просто бачиться як каталог файлової системи Експортування обєктів kobjec t у вигляді файлової системи виконується шляхом побудови дерева елементів каталогів в оперативній памяті Але зверніть увагу, обєкти kobjec t вже утворюють деревоподібну структуру – нашу модель пристроїв Тому просте призначення кожному обєкту ієрархії, які вже утворюють дерево в памяті, відповідного елемента каталогу дозволяє легко побудувати файлову систему sysfs

На рис 172 показаний частковий вид файлової системи sysfs, яка змонтована на каталог / sys

Кореневий каталог файлопой системи sysfs містить сім підкаталогів: block, bus, class, devices, firmware, module і power У каталозі bloc k містяться каталоги для кожного зареєстрованого в системі пристрою блочного введення-виведення

/sys

block/ fd0 hda dev

device-&gt / /devices/psi0000:00/0000:00:1f1/ide/00 hda1

hda2 hda3 hda4 hda5 hda6

dev size start star

bus/

queue

lidc hdd loop0 loop1

Ioop2

Ioop3

Ioop4

Ioop5

Ioop6

Ioop7 md0

class/ devices/ firmware/ power

Рис 172 Вміст частині каталогу / sys

Кожен з каталогів в свою чергу містить підкаталоги, відповідні розділам блочного пристрою Каталог bu s дозволяє переглядати інформацію про системні шинах У каталозі clas s представлена інформація про системні пристроях, яка організована відповідно до високорівневими функціями цих пристроїв Каталог device s містить інформацію про топологію пристроїв в системі Вона відображається безпосередньо на ієрархію структур пристроїв ядра Каталог firmware містить специфічне для даної системи дерево низькорівневих підсистем, таких як ACPI, EDD, EFT і тд У каталозі power містяться дані з управління електроживленням всіх пристроїв системи

Найбільш важливим є каталог devices, який експортує модель пристроїв ядра у зовнішній світ Структура каталогу відповідає топології пристроїв в системі Більшість інформації, яка міститься в інших каталогах, – це просто інше уявлення даних каталогу devices Наприклад, в каталозі / sys / class / net / інформація представлена ​​відповідно до високорівневим поданням зареєстрованих мережевих пристроїв У цьому каталозі може міститися підкаталог eth0, який містить символьне посилання device на відповідний пристрій каталогу devices

Подивіться на вміст каталогу / sy s тієї системи Linux, до якої ви маєте доступ Таке уявлення системних пристроїв є дуже чітким і ясним Воно показує взаємозвязок між високорівневим представленням інформації в каталозі class, низькорівневим поданням в каталозі device s

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

Додавання та видалення обєктів на файлової системі sysfs

Ініціалізовані обєкти kobjec t автоматично не експортуються через файлову систему sysfs Для того щоб зробити обєкт видимим через sysfs, необхідно використовувати функцію kobject_add ()

int kobject_add(struct kobject *kobj)

Положення обєкта на файлової системі sysfs залежить від його положення в обєктній ієрархії Якщо встановлено вказівник paren t обєкта, то обєкт буде відображений всередині каталогу, відповідного обєкту, на який вказує покажчик parent Якщо покажчик paren t не встановлений, то обєкт буде відображений у каталозі, відповідному значенню змінної kset-> kobj Якщо для деякого обєкта не встановлені ні значення поля parent, ні значення поля kset, то вважається, що даний обєкт не має батьківського та буде відображатися в кореневому каталозі файлової системи sysfs Така поведінка практично завжди відповідає тому, що потрібно Тому одне з полів paren t або kse t (або обидва) має бути встановлено правильним чином перед викликом функції kobject_ad d () Імя каталогу, який представляє обєкт kobjec t в файлової системі sysfs, визначатиметься значенням поля kobj-> name

Замість послідовно викликати функції kobject_ini t () і kobject_add (), можна викликати функцію kobject_registe r ()

int kobject_register(struct kobject *kobj)

Видалення обєкта з файлової системи sysfs виконується за допомогою функції kobject_del ()

void kobject_del(struct kobject *kobj)

Функція kob j е ctunregis t er () поєднує в собі виконання функцій kobject_del () і kobject_put ()

void kobject_unregister(struct kobject * kobj)

Всі ці чотири функції визначені у файлі lib / kobject с і оголошені у файлі

1Якщо вас зацікавила інформація я про файлово ї системі sysfs, то, ймовірно, вам буде цікаво про також ознайомитися з HAL, hardware abstraction layer (рівень абстракції апаратного забезпечення), информаци я про які м доступна за адресою http://halfreedesktoporg/ Підсистема HAL дозволяє створити в оперативно й памят і базу даних на основани і інформаці і файлово ї системи sysfs, обєднуючи разом поняти я класів, пристроїв і драйверів На підставі цих даних рівень HAL надає API, которо е позволяе т разрабативат ь більш інтелектуальні програми

Додавання файлів на файловій системі sysfs

Обєкти kobjec t відображаються на каталоги, і таке відображення виконується природним чином А як щодо створення файлів – це не що інше, як дерево каталогів без файлів

Атрибути, використовувані за замовчуванням

Набір файлів, які створюються в каталозі за замовчуванням, визначається за допомогою поля ktype обєктів kobjec t і множин kset Отже, всі обєкти kobjec t одного типу мають один і той же набір файлів в каталогах, які цим обєктам відповідають Структура kobject_typ e містить поле default_attrs, яке являє собою масив структур attribute Атрибути відображають дані ядра на файли у файловій системі sysfs

Структура attribute s визначена у файлі

/ * Структура attribut e атрибути дозволяють відобразити дані ядра на файли файлової системи sysfs * /

struct attribute {

char

*name

/ * Імя атрибута * /

struct module

mode_t

*owner

mode

/ * Модуль, якщо є, якому належать дані * /

/ * Права доступу до файлу * /

}

Поле name містить імя атрибута Таке ж імя буде мати і відповідний файл на файловій системі sysfs Поле owner – це покажчик на структуру module, яка представляє завантажуваний модуль, що містить відповідні дані Якщо такого модуля не існує, то значення поля одно NULL Поле mode має тип mode_t і вказує права доступу до файлу на файлової системі sysfs Якщо атрибут призначений для читання всіма, то прапор прав доступу Доллс бути встановлений в значення S_IRUGO, якщо атрибут має право на читання тільки для власника, то права доступу встановлюються в значення S_IRUSR Атрибути з правом на запис, швидше за все, будуть мати права доступу S_IRUGO | S_IWUSR Всі файли і каталоги на файлової системі sysfs належать користувачу з ідентифікаторами користувача та групи рівними нулю

Структура attribut e використовується для представлення атрибутів, а структура sysfs_op s описує, як ці атрибути використовувати Поле sysfs_op s – це покажчик на однойменну структуру, яка визначена у файлі таким чином

struct sysfs_ops {

/ * Метод викликається при читанні файлу на файлової системі sysfs * /

ssize_t (*show) (struct kobject *kobj, struct attribute *attr, char *buffer)

/ * Метод викликається при записі файлу на файлової системі sysfs * /

ssize_t (*store) (struct kobject *kobj, struct attribute *attr, const char *buffer, size_t size)

}

Метод show () викликається при читанні файлу Він повинен виконати копіювання значення атрибута, який передається як параметр attr, в буфер, на який вказує параметр buffer Розмір буфера дорівнює PAGE_SIZE байт Для апаратної платформи значення PAGE_SIZE одно 4096 байтів Функція повинна повернути кількість байтів даних, які записані в буфер у разі успішного завершення, і негативний код помилки, якщо така помилка виникає

Метод store () викликається при записі Він повинен скопіювати siz e байт даних з буфера buffe r в атрибут attr Розмір буфера завжди дорівнює PAGE_SIZE або менше Функція повинна повернути кількість байтів даних, які прочитані з буфера при успішному виконанні, і негативний код помилки в разі невдалого завершення

Так як цей набір функцій повинен виконувати операції введення-виведення для всіх атрибутів, то необхідно виконати деякі додаткові дії, щоб викликати оброблювач, специфічний для кожного атрибута

Створення нового атрибута

Зазвичай атрибутів, які використовуються за замовчуванням і надаються типом ktype, повязаним з обєктом kobject, виявляється достатньо Дійсно, всі обєкти kobjec t одного типу повинні бути чимось схожі один на одного або навіть бути ідентичними за своєю природою Наприклад, для всіх розділів жорстких дисків один і той же набір атрибутів повинен підходити для всіх обєктів kobject Це не просто спрощує життя, а й дозволяє впорядкувати код і отримати однаковий спосіб доступу до всіх каталогів файлової системи sysfs, повязаним з родинними обєктами

Проте іноді потрібно, щоб певний екземпляр обєкта kobjec t мав деякі специфічні властивості Для таких обектоп може виявитися бажаним (або необхідним) створити атрибут, якого немає у спільного типу даного обєкта Для такого випадку ядро ​​надає функцію sysf s_create_fil e () для додавання атрибута до існуючого обєкту

int sysfs_create_file(struct kobject *kobj, const struct attribute *attr)

Ця функція дозволяє привязати структуру attribute, на яку вказує параметр attr, до обєкта kobject, на який вказує параметр kobj Перед тим як викликати цю функцію, необхідно встановити значення атрибута (заповнити поля структури) Ця функція повертає значення нуль у випадку успіху і негативне значення у разі помилки

Зверніть увагу, що для обробки зазначеного атрибута використовується структура sysfs_ops, відповідна типу ktype обєкта Іншими словами, існуючі функції show () і stor e {), які використовуються для обєкта за замовчуванням, повинні мати можливість обробити новостворений атрибут

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

int sysfs_create_link(struct  kobject *kobj,

struct kobject *target, char *name)

Ця функція створює символьне посилання з імям name в каталозі обєкта, відповідного параметру kobj, на каталог, відповідний параметру target Ця функція повертає нульове значення у разі успіху і негативний код помилки в іншому випадку

Видалення створеного атрибута

Видаляється атрибут за допомогою виклику функції sysfs_remove_f il e ()

void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr)

Після повернення з цієї функції зазначений атрибут більше не відображається в каталозі обєкта

Символьне посилання, створена за допомогою функції sysfs_create_lin k (), може бути вилучена за допомогою функції sysfs_remove_link ()

void  sysfs_remove_link  (struc t  kobject *kobj, char *name)

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

Всі ці чотири функції оголошені у файлі Функції sysfs_create_file () і sysfs_remove_file () визначені у файлі fs / sysfs / fileс, а функції sysfs_create_link () і sysfs_remove_link () – у файлі fs / sysfs / symlinkc

Угоди по файловій системі sysfs

– це місце, де повинна реалізовуватися функціональність, для якої раніше використовувався системний виклик ioctl () для спеціальних файлів пристроїв, або файлова система procfs Сьогодні модно виконувати такі речі через атрибути файлової системи sysfs у відповідному каталозі Наприклад, замість того щоб реалізувати нову директиву ioctl () для спеціального файлу пристрою, краще додати відповідний атрибут в каталозі файлової системи sysfs, який відноситься до цього пристрою Такий підхід дозволяє уникнути використання небезпечних, через відсутність перевірки типів аргументів, директив ioct l (), а також файлової системи / рrо з з її безсистемним розташуванням файлів і каталогів

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

По-перше, кожен атрибут sysfs повинен експортувати значення однієї змінної на файл Значення повинні бути в текстовому форматі і відповідати простим типам мови програмування С Метою такого подання є необхідність уникнути надзвичайно заплутаної і погано структурованого подання інформації, яке ми сьогодні маємо на файлової системі / ргос Використання однієї змінної на файл дозволяє легко зчитувати і записувати дані з командного рядка, а також просто працювати через файлову систему sysfs з даними ядра в програмах, написаних мовою С У випадках, коли одне значення на файл призводить до неефективного поданням інформації, допустимо використання файлів, в яких зберігається кілька значень одного типу Ці дані необхідно чітко розділяти Найбільш кращим роздільником є ​​символ пробілу При розробці коду ядра необхідно завжди памятати, що

файли файлової системи sysfs є уявленнями змінних ядра, і орієнтуватися на доступ до них з простору користувача, зокрема з командного рядка

По-друге, дані файлової системи sysfs повинні бути організовані у вигляді чіткої ієрархії Для цього необхідно правильно розробляти звязку родітельпотомок обєктів kobject Повязувати атрибути з обєктами kobjec t необхідно з урахуванням того, що ця ієрархія обєктів існує не тільки в ядрі, але й експортується в простір користувача Структуру файлової системи sysfs необхідно підтримувати в чіткому вигляді

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

Ці прості угоди дозволяють за допомогою файлової системи sysfs забезпечити в просторі користувача інтерфейс ядра з широкими можливостями При правильному використанні файлової системи 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>

*

*