Отображение указателя глобальной переменной в пространстве ядра на пространство пользователя? - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь получить доступ к переменной, созданной в пространстве ядра.Моя цель - обнаружить флаг прерывания.Для этого я создал ioctl и использую copy_to_user () для передачи указателя переменной пользователю в виде кода ядра ниже: - Я конвертирую виртуальный адрес «irq_flag» в физический адрес и передаю пользователю.

#define GET_FLAG        _IOW('F', 0x27, int)
...    
int irq_flag = 0;      //Global variable
...
case GET_FLAG:         //IOCTL
    {
        int my_value;
        char *value_ptr;

        value_ptr = virt_to_phys(&irq_flag);
        my_value = value_ptr;
        if (copy_to_user((void __user *)arg,(void *)&my_value,
            sizeof(irq_flag)))
            return -EFAULT;
        return 0;
    }

Код пользователя: Получить физический адрес из ioctl и сопоставить его с виртуальным адресом

mem_fd = open("/dev/mem", O_RDWR);
fb_fd = open("/dev/fb", O_RDWR);

int temp;
int flag_addr;
int *flag;

temp = ioctl(fb_fd, FBIOGET_FLAG, &flag_addr);
flag = mmap(NULL, sizeof(int), PROT_WRITE | PROT_READ, MAP_SHARED, mem_fd, flag_addr);
...//processing code
while(1){
  *flag = 0;      //my idea is that flag will be set to 1 in interrupt callback function and break the loop.
  while(!*flag) {   }
}

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

1 Ответ

0 голосов
/ 20 марта 2019

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

Вы не проверяли mmap() возвращаемое значение для MAP_FAILED значения ((void *) -1), а затем пытались получить доступ к этому недействительному адресу памяти.

...