Я пытаюсь получить доступ к переменной, созданной в пространстве ядра.Моя цель - обнаружить флаг прерывания.Для этого я создал 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) { }
}
Но он возвращает ошибку сегментации. Не могли бы вы дать мне некоторое представление о том, в чем я ошибаюсь, или это другой способ сопоставить указатель из ядра спространство пользователя.Извините за мой английский.