用于自动边界检查的x86-64机制

问题描述:

用户模式x64中是否存在任何用于硬件的方案来自动应用对每个内存加载和存储的边界检查,而无需编译器的显式检测?我也不想依赖操作系统支持(例如mprotect系统调用)。用于自动边界检查的x86-64机制

<begin: enforce all accesses within 0x10000000-0x10000100> ... mov ___, ___ #hardware automatically performs range check ... <end enforcement>

据我所知,英特尔MPX需要明确的bndcl/bndcu指令之前检查每一个内存访问。

+0

你可以处理当你试图解引用不良地址时得到的信号......就像调试器一样;但我向你保证这是愚蠢的 –

+0

在什么范围内,只是“有效记忆”或“仍然在它应该在的物体内部”? – harold

+0

我有一种方法来计算虚拟地址的上限和下限,我希望强制受保护的代码只能在该范围内访问。 – rsinha

不可以。原因很简单,CPU不水晶球和边界是什么信息必须来自某处。并且确定“什么”并且是“某处”的任务。

+0

我明白了。我愿意在受保护的代码之前提供界限。我只是不希望在受保护的代码中检测每个内存访问。 – rsinha

+0

@rsinha:计算机是确定性的。如果您知道从索引生成地址的边界和公式,则应该用数学方法进行证明,假定公式和边界不会生成这些边界以外的地址。有了这样的证明,你可以100%确定,没有OOB访问会发生。这种可证明性是Rust,Haskell等编程语言在内存安全性方面的核心,严格地说是静态类型检查。如果编译器可以在编译时证明内存访问保持在边界内,它将省略边界检查 – datenwolf

+0

用于这种分析的类型系统非常好 - 当然,Rust可以强制内存访问将在数组的范围内。但是,如果我想证明或强制执行(在运行时)内存操作将只访问数组的上半部分 - 基本上任何更细粒度的控制 - 它将需要更重量级的证明技术,如依赖类型。 – rsinha