x86 上的加载溢出最高地址

load overflow topmost address on x86

当未对齐的加载溢出 x86 上的最顶层地址时会发生什么?例如,当在 32 位 x86 处理器上的地址 0xfffffffe 加载一个 4 字节整数时会发生什么?当然,最顶层的页面(0xfffff000-0xffffffff)映射到某个物理内存,页面为readable/writable,当前加载的程序在Ring0的操作系统内核中。为简单起见,您可以假设在 0xfffffffc 加载 4 字节是合法的。

这样的加载会产生页面错误吗?

由于段中的限制检查,它会产生一般保护(#GP)错误。通常情况下,使用 DS 段寄存器访问数据时,处理器会检查段限制。 DS段寄存器默认段限制为[0,0xffffffff).

每当尝试访问段中的以下地址时,处理器都会引发一般保护异常:

  • 偏移量大于有效限制的字节
  • 偏移量大于(有效限制 - 1)的字
  • 一个双字,其偏移量大于(有效限制 – 3)
  • 偏移量大于(有效限制 – 7)的四字

根据 Intel x86 规范,"explicitly unaligned" 访问(无论它们是否在您地址的边缘 space)也会导致 AVX、FME、VEX、或 SSE 说明。

有趣的是,最低地址和最高地址并不是您地址 space 中可能发生这种情况的唯一边界。更多边界出现在 x86_64 地址 space 中,中间有一个 sparse / unaddressable space 是你的处理器不能使用的(因为这样处理器制造商可以减少位数许多处理器内部都需要——毕竟,还没有人使用完整的 64 位地址 space)。