将内核 space 中的全局变量指针映射到用户 space?
Mapping a pointer of global variable in kernel space to user space?
我正在尝试访问在内核 space 中创建的变量。我的目的是检测中断标志。为此,我创建了一个 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) { }
}
但是它 return 分段错误,你能告诉我我哪里错了吗,或者是另一种将指针从内核映射到用户的方法 space。对不起我的英语。
尽管可以获取内核 space 对象的物理地址并将其发送给用户 space,但无法从用户 space 访问内核 space,否则任何恶意软件将获得读取任何内核结构的完全访问权限。
您没有检查 mmap()
return 值是否为 MAP_FAILED
值 ((void *) -1
) 然后试图访问这个无效的内存地址。
我正在尝试访问在内核 space 中创建的变量。我的目的是检测中断标志。为此,我创建了一个 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) { }
}
但是它 return 分段错误,你能告诉我我哪里错了吗,或者是另一种将指针从内核映射到用户的方法 space。对不起我的英语。
尽管可以获取内核 space 对象的物理地址并将其发送给用户 space,但无法从用户 space 访问内核 space,否则任何恶意软件将获得读取任何内核结构的完全访问权限。
您没有检查 mmap()
return 值是否为 MAP_FAILED
值 ((void *) -1
) 然后试图访问这个无效的内存地址。