MyTetra Share
Делитесь знаниями!
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.



 
MyTetra Share v.0.65
Яндекс индекс цитирования