|
|||||||
8. Sysfs: взаимодействие с модулем
Время создания: 20.09.2022 09:47
Текстовые метки: linux, ядро, модуль, программирование, язык, C, Си, пособие, документация
Раздел: Компьютер - Linux - Ядро - Пособие по программированию модулей ядра Linux
Запись: xintrea/mytetra_syncro/master/base/1663656433zyi752vx0r/text.html на raw.github.com
|
|||||||
|
|||||||
8. Sysfs: взаимодействие с модулем Sysfs позволяет взаимодействовать с работающим ядром из пользовательского пространства, считывая или устанавливая переменные внутри модулей. Это может пригодиться в целях отладки или же в качестве интерфейса для приложений либо скриптов. Каталоги и файлы sysfs располагаются в /sys. ls -l /sys Атрибуты для kobjects в этой файловой системе можно экспортировать в форме стандартных файлов. Sysfs перенаправляет файловые операции ввода-вывода в определенные для этих атрибутов методы, тем самым обеспечивая средства для считывания и записи атрибутов ядра. Определение атрибута: struct attribute { char *name; struct module *owner; umode_t mode; };
int sysfs_create_file(struct kobject * kobj, const struct attribute * attr); 8void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr); К примеру, модель драйвера определяет struct device_attribute так: struct device_attribute { struct attribute attr; ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf); ssize_t (*store)(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); };
int device_create_file(struct device *, const struct device_attribute *); void device_remove_file(struct device *, const struct device_attribute *); Чтобы иметь возможность читать и записывать атрибут, при его объявлении необходимо указать метод show() или store(). Для распространенных случаев include/linux/sysfs.h предоставляет удобные макросы (__ATTR, __ATTR_RO, __ATTR_WO, и т.д.), упрощая определение атрибутов, а также позволяя сделать код более лаконичным и читаемым. Вот пример модуля “Hello world”, который включает создание переменной, доступной через sysfs: hello-sysfs.c /* * hello-sysfs.c - пример использования sysfs */ #include <linux/fs.h> #include <linux/init.h> #include <linux/kobject.h> #include <linux/module.h> #include <linux/string.h> #include <linux/sysfs.h>
static struct kobject *mymodule;
/* Переменная, которую нужно будет изменять. */ static int myvariable = 0;
static ssize_t myvariable_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { return sprintf(buf, "%d\n", myvariable); }
static ssize_t myvariable_store(struct kobject *kobj, struct kobj_attribute *attr, char *buf, size_t count) { sscanf(buf, "%du", &myvariable); return count; }
static struct kobj_attribute myvariable_attribute = __ATTR(myvariable, 0660, myvariable_show, (void *)myvariable_store);
static int __init mymodule_init(void) { int error = 0;
pr_info("mymodule: initialised\n");
mymodule = kobject_create_and_add("mymodule", kernel_kobj); if (!mymodule) return -ENOMEM;
error = sysfs_create_file(mymodule, &myvariable_attribute.attr); if (error) { pr_info("failed to create the myvariable file " "in /sys/kernel/mymodule\n"); }
return error; }
static void __exit mymodule_exit(void) { pr_info("mymodule: Exit success\n"); kobject_put(mymodule); }
module_init(mymodule_init); module_exit(mymodule_exit);
MODULE_LICENSE("GPL"); Компиляция и установка модуля: make sudo insmod hello-sysfs.ko Убеждаемся в успешности операции: sudo lsmod | grep hello_sysfs Каково текущее значение myvariable? cat /sys/kernel/mymodule/myvariable Установка значения myvariable и проверка, изменилось ли оно: echo "32" > /sys/kernel/mymodule/myvariable cat /sys/kernel/mymodule/myvariable Наконец, извлечение тестового модуля: sudo rmmod hello_sysfs В случае выше мы используем для создания каталога в sysfs и взаимодействия с его атрибутами простой kobject. Начиная с Linux v2.6.0, структура kobject постепенно обретала свой нынешний облик. Изначально она подразумевалась как простой способ унификации кода ядра, управляющего объектами с подсчетом ссылок. Однако спустя некоторое время ее назначение расширилось, и теперь она связывает большую часть модели устройства и ее интерфейса sysfs. Подробнее о kobject и sysfs читайте в Documentation/driver-api/driver-model/driver.rst и lwn.net/Articles/51437. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|