2012-03-11 1 views
0

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

арка/x86/ядра/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); 

включают/линукс/foo.h

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

арка/x86/randomfile.c

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

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

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

ответ

0

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

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

enum foo_enum 
{ 
    foo = 12 
}; 

int foobar = (12 + foo); 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^