gpt4 book ai didi

c - 直接访问用户空间地址而不是 copy_to_user 是否可行?

转载 作者:太空狗 更新时间:2023-10-29 15:40:10 25 4
gpt4 key购买 nike

以下是我的简单驱动程序代码的摘录。

int vprobe_ioctl( struct file *filep, unsigned int cmd, void *UserInp)
{
case IOCTL_GET_MAX_PORTS:

*(int*)UserInp = TotalPorts;

#if ENABLED_DEBUG
printk("Available port :%u \n ", TotalPorts);
#endif
break;
}

我不知道函数 copy_to_user 应该在写入用户空间内存时使用。该代码直接访问用户地址。但是我的开发系统(x86_64 架构)中仍然没有出现任何内核崩溃。它按预期工作。

但有时当我在其他一些 x86_64 机器中插入 .ko 文件时,我会看到内核崩溃。因此,我用 copy_to_user 替换了直接访问,它起作用了。

谁能解释一下,

i) 如何直接访问用户地址?

ii) 为什么我看到内核在某些系统中崩溃,而在其他一些系统中运行良好。系统之间是否存在任何内核配置不匹配,导致内核可以直接访问用户进程的虚拟地址?

注意:我使用的所有系统都具有相同的操作系统和内核。- 通过 kickstart 生成的相同图像。 - 不可能有任何差异。

提前致谢。

最佳答案

看到崩溃会很有趣。现在我所说的是基于我对内存如何工作的了解的假设。用户空间内存是虚拟的。这意味着特定进程地址 X 现在位于某个物理内存上,这个物理内存是当前分配给您的进程的内存页。复制给用户首先检查给定的内存是否真的属于进程和其他安全检查。除此之外还有映射问题。

内核内存有自己的地址空间,需要将虚拟地址映射到物理地址。内核使用 mmu 的帮助(每个体系结构不同)。在 x86 中,内核虚拟和用户虚拟之间的映射是 1:1(这里有不同的问题)。在其他系统中,这并不总是正确的。

关于c - 直接访问用户空间地址而不是 copy_to_user 是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39158631/

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