Доступ к переменной / proc fs из других частей кода ядра - PullRequest
1 голос
/ 18 февраля 2011

Я пытаюсь заставить программу уровня пользователя взаимодействовать с ядром через /proc.

.

Я следовал инструкциям на tldp и успешно смог создать собственный файл proc, динамически загрузить его с помощью insmod и прочитать (cat) и записать (echo) в файл proc из пользовательского пространства.

Теперь мой вопрос: как мне получить доступ к переменной / proc (это байтовый буфер) из другой части ядра, скажем, инфраструктуры системных вызовов? Так как пользовательский файл proc динамически загружается и связывается, как я могу ссылаться на него из статически скомпилированного кода ядра?

Технические характеристики системы: Ubuntu 10.10 работает в VMWare Fusion на MacBook Pro 13 "(2009).

Редактировать: соответствующий код (по запросу) -

procfile.c

//This function is called when the module is loaded
int init_module()
{
    /* create the /proc file */

    EXPORT_SYMBOL(procfs_buffer);
    EXPORT_SYMBOL(procfs_buffer_size);
...
...
}

get_procvariable.c (в другой части ядра)

//The buffer used to store character for this module
extern char * procfs_buffer;

//The size of the buffer
extern unsigned long procfs_buffer_size;

int get_procvariable(void)
{
.. do something
return procfs_buffer; // LD Error: Undefined reference
}

Дайте мне знать в комментариях, если вам нужна дополнительная информация. Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 21 февраля 2011

Вы не должны ссылаться на динамически загружаемый код в ядре (т. Е. На модули) из статически загруженного кода (т. Е. На системные вызовы). Если вы помещаете статически загруженный код в ядро, любая его конфигурация должна быть представлена ​​другим статически загруженным кодом. Однако трудно дать более конкретный совет, не зная, какую функциональность вы реализуете.

1 голос
/ 22 февраля 2011

Ответил на мой вопрос, взяв несколько подсказок из ответов выше:

Ключевым моментом, который мне не хватало, было то, что мне нужно было объявить переменную (скажем, int kernel_var = 0;) в самом ядре (а не в модуле заголовка procfs, как я раньше делал неправильно). После этого экспортируйте его с помощью EXPORT_SYMBOL, который добавит его в глобальную таблицу символов модуля и, наконец, включит его в служебный модуль procfs как переменную extern.

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

Я закодировал эту гипотезу, и она сработала как заклинание.

0 голосов
/ 19 февраля 2011

Экспортируйте символ из модуля, используя EXPORT_SYMBOL, а затем используйте его в другой части ядра.

...