2017-01-20 15 views
1

Я пытаюсь научиться писать модуль sysfs и путаюсь при базовой инициализации. В документе this, смотрящем файл kobject.h, существует несколько различных функций, связанных с созданием записи sysfs.Написание модуля 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, ...); 

структура kobject и структура kobj_type являются достаточно простым, но я не понимаю что должны быть * parent kobject и * fmt cstring.

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

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

ответ

2

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

Модуль 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 модуля на основе вышеприведенного кода и Вы можете за любую помощь.

+0

Итак, для атрибутов, таких как & module_attr в примере sysfs_create_group, где указано это & ​​module_attr? Потому что, похоже, у меня проблемы. Я читал, что вы можете использовать макрос __ATTR, но это вызывает ошибки для меня. – Zephyr

+0

Вы можете определить, как показано ниже: static struct attribute_group module_attr = { .attrs = module_attribute, }; –

+0

Понял, мой вопрос в том, должен ли «module_attribute» использовать его, нужно заранее определить или просто объявить? – Zephyr

0

Существует множество модулей ядра, которые создают записи 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

Рами Розно

+0

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