Написание модуля Sysfs

Я пытаюсь научиться писать модуль sysfs и запутался в базовой инициализации. В этом документе рассматривается kobject.h существует несколько различных функций, связанных с созданием записи sysfs.

Судя по всему, функция «kobject_init_and_add» кажется правильной для использования, которая требует следующего:

 90 int kobject_init_and_add(struct kobject *kobj,
 91                          struct kobj_type *ktype, struct kobject *parent,
 92                          const char *fmt, ...);

struct kobject и struct kobj_type достаточно просты, но я не понимаю, что такое *parent kobject и *fmt cstring.

Далее, после инициализации этих объектов, мне нужно было бы удалить их в функции exit_module, но возможны два варианта: kobject_del и kobject_puts. Каковы различия между ними?

Частично мое замешательство связано с тем фактом, что при поиске ответа в Google я вижу учебные пособия, в которых говорится, что вместо этого следует использовать такие функции, как kobject_register, но на самом деле эта функция не существует.


person Zephyr    schedule 20.01.2017    source источник


Ответы (2)


Да, в основном ядре есть много примеров, на которые вы можете ссылаться для своей реализации. Для ваших сомнений я добавляю пример кода"

Модуль Probe/функция инициализации

static struct kobject   *module_kobject;
module_kobject=kobject_create_and_add("module_status",NULL);
sysfs_create_group(module_kobject,&module_attr);

Функция удаления/выхода модуля

sysfs_remove_group(module_kobject,&module_attr);
kobject_put(module_kobject);

Если вы хотите предоставить более одного атрибута в пользовательском пространстве; чем вам нужно также определить группу

static struct attribute_group module_attr={
.attrs = module_attribute,
};

Вам может понадобиться еще одна реализация и функция, например:

static ssize_t module_show_status(struct kobject *kobj,struct kobj_attribute *attr,char *buf);
static ssize_t module_store__status(struct kobject *kobj,struct kobj_attribute *attr,const char *buf,size_t len);

Я думаю, вы можете начать реализацию модуля sysfs на основе приведенного выше кода и не стесняйтесь обращаться за любой помощью.

person vinod maverick    schedule 21.01.2017
comment
Итак, для таких атрибутов, как &module_attr в примере sysfs_create_group, где определяется этот &module_attr? Потому что это, кажется, где у меня проблемы. Я читал, что вы можете использовать макрос __ATTR, но у меня это вызывает ошибки. - person Zephyr; 23.01.2017
comment
Вы можете определить, как показано ниже, структуру static struct attribute_group module_attr={ .attrs = module_attribute, }; - person vinod maverick; 23.01.2017
comment
Понятно, мой вопрос в том, должен ли используемый вами «module_attribute» быть определен заранее или просто объявлен? - person Zephyr; 23.01.2017
comment
Вам нужно определить атрибут module_attribute, я просто публикую способ, который вам нужно реализовать в вашем коде: static ssize_t module_show_minimum_value(struct kobject *kobj,struct kobj_attribute *attr,char *buf){ // Добавьте свой код }; статическая структура kobj_attribute module_attribute= __ATTR(min_value,0777,module_show_minimum_value, NULL); статическая структура attribute_group module_attr={ .attrs = module_attribute, }; - person vinod maverick; 23.01.2017

Существует множество модулей ядра, которые создают записи sysfs. Например, http://lxr.free-electrons.com/source/net/bridge/br_sysfs_br.c Этот модуль использует kobject_create_and_add(), который получает в качестве параметра экземпляр kobject, созданный с помощью sysfs_create_group(). Я считаю, что изучение такого модуля и попытка кодирования шаг за шагом, следуя шаблонам в этом модуле, могут помочь. Также загляните в http://lxr.free-electrons.com/source/Documentation/kobject.txt

Рами Розен

person Rami Rosen    schedule 20.01.2017
comment
Спасибо, я попробую это. Знаете ли вы о каком-либо таком примере, на который я мог бы посмотреть для создания экземпляра атрибута? В sysfs, на который вы ссылаетесь выше, есть экземпляр, в котором несколько атрибутов объединены в группу атрибутов, а затем назначены, но я не совсем понимаю, как создать эти атрибуты для начала. - person Zephyr; 23.01.2017