#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. Настоящий драйвер добавил бы файл устройства или что-то в этом роде, а не системный вызов