Объявление переменной в файле ядра Linux для использования в пользовательском файле C?

#c #linux #global-variables

#c #linux #глобальные переменные

Вопрос:

Итак, я неустанно изучал это, и, похоже, ничего не работает. Все, что я хочу сделать, это инициализировать значение int равным 0 при запуске. В настоящее время я нахожусь в /kernel/sys.c, и у меня есть

/kernel/sys.c

 int process_log_level;
EXPORT_SYMBOL(process_log_level);
  

Ниже приведены некоторые пользовательские системные вызовы, которые просто увеличивают переменную. Системные вызовы вызываются в файле ниже, и переменная увеличивается просто отлично, если вы запустите

 sudo dmesg -c
  

но все, что я хочу, чтобы мой файл C читал int process_log_level .
У меня переменная объявлена следующим образом.
../process_log/process_log.c

 #include <unistd.h>
#include <linux/module.h>
#include <stdio.h>
#include "process_log.h"

extern int process_log_level;

int main(int argc, char *argv[])
{
    printf("process_log_level = %d", process_log_level);
    return 0;
}
  

Всякий раз, когда я пытаюсь скомпилировать файл, мне говорят, что есть неопределенная ссылка на «process_log_level». Все, что я хочу сделать, это иметь доступ к этой переменной в process_log.c . Есть ли что-то, чего мне здесь не хватает?

Комментарии:

1. Это не имеет смысла. Вопрос такой: у моего соседа есть вода. Как я могу использовать воду моих соседей? Ну, вы не можете. Если только сосед не позволит вам.

2. У меня сложилось впечатление, что это было целью макроса EXPORT_SYMBOL() . Разве это не позволяет другим модулям использовать выбранную функцию / переменную?

3. другие модули — да. Не программы пользовательского пространства.

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

5. EXPORT_SYMBOL позволяет другим модулям использовать этот символ. Обычные программы не могут использовать какие- либо символы из ядра. Только модули могут.

Ответ №1:

Пользовательское пространство и ядро взаимодействуют через системные вызовы.

Ниже приведены некоторые пользовательские системные вызовы

все, что я хочу, чтобы мой файл C читал int process_log_level .

Поэтому просто добавьте еще один системный вызов, который вернет значение в пользовательскую программу. Затем вызовите этот системный вызов из вашей программы, чтобы получить значение из kernelspace.

Комментарии:

1. Настоящий драйвер добавил бы файл устройства или что-то в этом роде, а не системный вызов