gpt4 book ai didi

linux - 将内核空间中的全局变量指针映射到用户空间?

转载 作者:太空宇宙 更新时间:2023-11-04 11:53:32 26 4
gpt4 key购买 nike

我正在尝试访问在内核空间中创建的变量。我的目的是检测中断标志。为此,我创建了一个 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) { }
}

但它返回段错误,你能告诉我我哪里错了吗,或者是另一种将指针从内核映射到用户空间的方法。对不起我的英语。

最佳答案

尽管可以获取内核空间对象的物理地址并将其发送到用户空间,但不能从用户空间访问内核空间,否则任何恶意软件都可以获得读取任何内核结构的完全访问权限。

您没有检查 mmap() 返回值是否为 MAP_FAILED 值 ((void *) -1) 然后尝试访问到这个无效的内存地址。

关于linux - 将内核空间中的全局变量指针映射到用户空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55259273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com