linux - 对于arm Linux,用户空间中的线程可以访问内核空间的虚拟地址吗?

标签 linux linux-kernel arm

虚拟内存分为两部分。传统上0~3GB为用户空间,3GB~4GB为内核空间。

我的问题:

用户空间的线程可以访问内核空间的内存吗?

对于ARM datasheet,访问属性由域访问控制寄存器负责。但是在内核源代码中,用户空间虚拟内存的页表项中的域值与内核空间的页表项相同。

最佳答案

事实上,您的应用程序可能会访问页面 0xFFFF0000,因为它包含 swi-handler 和其他几个用户空间助手。所以不,3/1 拆分并不神奇,内核管理起来非常容易。

通常内核会将所有超过 3GB 的内存设置为只能由内核域本身访问。如果一个驱动程序需要在用户空间和内核空间之间共享内存,它通常会提供一个 mmap 接口(interface),然后创建一个别名映射,所以你有两个虚拟地址对应同一个物理地址。这仅在 VIPT-Cache 系统或大量仔细的显式缓存刷新下才能可靠地工作。如果你不想要这个,你可以破解内核,使用户空间可以访问 3G 拆分之上的一 block 内存。但随后所有用户空间应用程序将共享此内存。我已经为 armv5 系统上的一个特殊应用程序做过一次。

关于linux - 对于arm Linux,用户空间中的线程可以访问内核空间的虚拟地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11274030/

相关文章:

linux - 使用 FASM EQU 通过 $ - 符号计算出错误的大小 "len"

linux - 如何使 shell 脚本的一部分超时并在没有退出代码 0 的情况下重新运行它

linux-kernel - 仅使用 CAP_BPF 无法在 BPF 程序中直接访问数据包?

linux - ARM armv5tejl 交叉编译

node.js - 构建 Node.js 出现错误 : Node. js 配置错误:找不到可接受的 C 编译器

linux - Nginx 没有重新加载,但重新启动正常

c - 从用户空间访问内核内存(task_struct)

c - 内核符号已启用但未显示在 .config 中

c++ - 在汇编代码中寻找不必要的缓冲区拷贝

linux - 无法从配置文件访问关联