Как я могу использовать sysfs kobject в качестве глобальной переменной? - PullRequest
0 голосов
/ 12 марта 2012

Я хотел бы использовать редактируемую пользователем глобальную переменную в ядре Linux.Это возможно?Вот что я придумал, используя пример с исходным кодом:

arch / x86 / kernel / foo.c

#include <linux/kobject.h>
#include <linux/string.h>
#include <linux/sysfs.h>
#include <linux/module.h>
#include <linux/init.h>

int foo = 12;

static ssize_t foo_show(struct kobject *kobj, struct kobj_attribute *attr,
            char *buf)
{
return sprintf(buf, "%d\n", foo);
}

static ssize_t foo_store(struct kobject *kobj, struct kobj_attribute *attr,
         const char *buf, size_t count)
{
sscanf(buf, "%du", &foo);
return count;
}

static struct kobj_attribute foo_attribute =
__ATTR(foo, 0666, foo_show, foo_store);

static struct attribute *attrs[] = {
&foo_attribute.attr,
NULL,
};

static struct attribute_group attr_group = {
.attrs = attrs,
};

static struct kobject *example_kobj;

static int __init example_init(void)
{
int retval;

example_kobj = kobject_create_and_add("kobject_example", kernel_kobj);
if (!example_kobj)
    return -ENOMEM;

retval = sysfs_create_group(example_kobj, &attr_group);
if (retval)
    kobject_put(example_kobj);

return retval;
}

static void __exit example_exit(void)
{
kobject_put(example_kobj);
}

module_init(example_init);
module_exit(example_exit);

include /linux / foo.h

#ifndef FOO_H
#define FOO_H
extern unsigned int foo;
#endif

arch / x86 / randomfile.c

#include <linux/foo.h>
....
int foobar = ( 12 + foo );
....

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

Может ли кто-нибудь указать мне правильное направление, возможно, с практическим примером?

1 Ответ

0 голосов
/ 12 марта 2012

C глобальные переменные должны быть инициализированы значениями, известными во время компиляции. foo нет.

Как правило, можно инициализировать глобальное целое число со значениями перечисления, числовыми константами и математическими операциями для любого из них. Например, это действительно:

enum foo_enum
{
    foo = 12
};

int foobar = (12 + foo);

Но, очевидно, вы только что потеряли способность изменять foo во время выполнения.

Если есть функция, которая вызывается при загрузке модуля ядра (это функция, помеченная __init?), Вы можете выполнить инициализацию там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...