- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
以下是我的简单驱动程序代码的摘录。
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/
对于我的一个项目,我终于需要使用我的第一个多态类(std::cout 除外)。 我正在研究如何确保至少在某些情况下我有 100% 的去虚拟化调用。 这段代码是否合法可行? dynamic_cast 有
最近有一个编译问题,用这个片段说明: struct Base { }; template struct A : Base { A(){} A(Base&&) {} }; A foo()
注意:这是一个冗长的问题,需要对 MVVM“设计模式”、JSON 和 jQuery 有很好的理解.... 所以我有一个理论/主张 DHTML 中的 MVVM 是可能的 和可行的 并且想知道您是否同意/
我有一台 Mac 服务器,我正在构建 PHP 代码以允许用户上传图像、文档甚至视频文件。研究这个肯定让我很紧张,我希望上传的内容没有病毒。 自己构建一些东西会是一个巨大的挑战吗?您会这样做,还是会
根据文档,ASP.NET 项目(尚)不支持新的 PackageReference https://learn.microsoft.com/en-us/nuget/consume-packages/pa
我是一名优秀的程序员,十分优秀!