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