Доступ к переменной /proc fs из других частей кода ядра

Я пытаюсь заставить программу уровня пользователя взаимодействовать с ядром через /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 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам