[使用硬件内存保护在64位硬件上检查数组范围

问题描述 投票:17回答:2

我正在阅读hacks.mozilla.org上的64位Firefox版本的博客。

作者指出:

对于asm.js代码,增加的地址空间还使我们能够使用硬件内存保护来安全地删除asm.js堆访问中的边界检查。收益非常可观:arewefastyet.com上报告的[[asmjs-apps-*-throughput测试结果为8%-17%。

我试图了解64位硬件如何对C / C ++进行自动边界检查(假设编译器具有硬件支持)。我在SO中找不到任何答案。我找到了one technical paper on this subject,但是我不知道该如何完成。

有人可以在边界检查中解释64位硬件帮助吗?

我正在hacks.mozilla.org上阅读有关64位Firefox版本的博客。作者指出:对于asm.js代码,增加的地址空间还使我们可以使用硬件内存保护来安全删除...

c++ c x86-64 sandbox virtual-memory
2个回答
11
投票
[大多数现代CPU实现虚拟寻址/虚拟内存-当程序引用特定地址时,该地址是虚拟地址;到物理页面的映射(如果有)是由CPU的MMU(内存管理单元)实现的。 CPU通过在为当前进程设置的OS的page table中查找每个虚拟地址,将其转换为物理地址。这些查找由TLB缓存,因此大多数时间没有额外的延迟。 (在某些非x86 CPU设计中,TLB丢失由操作系统通过软件处理。)

3
投票
他们使用的技术类似于Windows pageheap调试模式,只是代替了将每个VirtualAlloc()粘贴在其自己的虚拟内存页面中的堆,这是一个将每个数组(基于静态或基于堆栈)粘贴在其中的系统。它自己的虚拟内存页面(更确切地说,它将分配放置在页面的

end

中,因为在数组末尾运行比在数组开始之前尝试访问更为常见)然后,它会在分配的页面之后放置一个无法访问的“保护页面”,在这种情况下甚至是相当数量的页面。
© www.soinside.com 2019 - 2024. All rights reserved.