虚拟内存分为两部分。传统上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/