我正在尝试访问在内核空间中创建的变量。我的目的是检测一个中断标志。为此,我创建了一个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) { }
}
但是它返回Segmentation Fault,您能给我一些我错在哪里还是将指针从内核映射到用户空间的另一种方法。对不起,我的英语。
答案 0 :(得分:0)
尽管可以获取内核空间对象的物理地址并将其发送到用户空间,但不能从用户空间访问内核空间,除非任何恶意软件都能获得读取任何内核结构的完全访问权限。
您没有检查mmap()
值(MAP_FAILED
的{{1}}返回值,然后尝试访问此无效的内存地址。