当未排列的写入越过页面边界并触发故障时会发生什么?
让我们假设一个32位值被写入跨越2页的内存位置。为了说明起见,我们假设2个字节在第一个页面中结束,另外2个字节在第二个页面中结束。第一页是可写的,但第二页是未映射的。整体执行指令会触发页面错误,这很好。当未排列的写入越过页面边界并触发故障时会发生什么?
我的问题是:将页面错误触发前或后的值的前2个字节写入内存?换句话说,在故障后(例如,故障处理程序)能够观察到部分写入的代码运行?
让我们假设一个X86环境,因为我怀疑这个行为可能是体系结构,甚至可能是模型特定的。
从英特尔架构手册卷3A:
访问到由所述的Intel Core 2 铎,英特尔原子™跨越高速缓存线分割并 页边界不保证是原子可高速缓冲存储, Intel Core Duo,Pentium M,Pentium 4,Intel Xeon, P6系列,Pentium和Intel486处理器。
国际海事组织不是原子的意思是你所描述的情况可能会发生。在写入前2个字节后可能会产生中断。
但是,在任何一个部分变得全局可见之前,必须完成页面拆分的两个部分的权限检查,除非我对它的工作方式有误。 –
我看不到不同的。 NOT-atomic意味着其他部分(其他核心或总线)可以观察部分写入,为什么当中断发生时,相同的核心不能观察部分写入?当发生页面错误时,我认为部分写入不会回滚。它使问题变得更加复杂,并且什么也得不到。 –
将取决于总线传输看起来像是什么,如果核心将其分成两个传输或者它是单个未对齐的传输......当然,更简单的答案只是尝试它是? –
IIRC,整个写入被故障中止。如果您想仔细检查,英特尔的x86手册应详细记录此信息。对此不太确定,但IIRC AVX512屏蔽的商店*可能*实际上在故障发生前存储了一些(非故障)元素。我刚刚检查了ISA参考手册中的分散指令,他们没有这么说:分散检查指定顺序的故障。 (但是对于散布的单个元素,如果它发生故障,它根本就没有完成。) –
如果有任何架构允许部分存储到非错误页面,我会感到惊讶。顺便说一句,在[x86标记wiki](https://stackoverflow.com/tags/x86/info)中链接到Intel的x86手册。 –
@PeterCordes - 我没有检查AVX-512商店,但毫无疑问,这是它的工作原理。即使是AVX2采集也是这样操作的:它们在每次采集操作后更新屏蔽寄存器(原则上是这样),这样它们可以被中断(我认为),所以如果抛出异常,则某些部分负载可能已经完成,掩码寄存器将反映(因此可能会解决问题并重新启动负载)。毫无疑问,AVX-512的收集工作是一样的,如果分散程度不同,它会很奇怪。 – BeeOnRope