Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 当未授权写入跨越页面边界并触发错误时会发生什么情况?_Assembly_X86_Operating System - Fatal编程技术网

Assembly 当未授权写入跨越页面边界并触发错误时会发生什么情况?

Assembly 当未授权写入跨越页面边界并触发错误时会发生什么情况?,assembly,x86,operating-system,Assembly,X86,Operating System,假设一个32位的值被写入一个跨越2页的内存位置。为了便于讨论,我们假设第一页有2个字节,第二页还有2个字节。第一页可写,但第二页未映射。整体执行指令将触发页面错误,这很好 我的问题是:在将值的前2个字节写入内存之前还是之后会触发页面错误?换句话说,在发生故障后运行的代码(例如,故障处理程序)是否能够观察到部分写入 让我们假设一个X86环境,因为我怀疑该行为可能是体系结构,甚至可能是特定于模型的。来自《英特尔体系结构手册》第3A卷: 访问跨缓存线拆分的可缓存内存和 Intel Core 2不保证页

假设一个32位的值被写入一个跨越2页的内存位置。为了便于讨论,我们假设第一页有2个字节,第二页还有2个字节。第一页可写,但第二页未映射。整体执行指令将触发页面错误,这很好

我的问题是:在将值的前2个字节写入内存之前还是之后会触发页面错误?换句话说,在发生故障后运行的代码(例如,故障处理程序)是否能够观察到部分写入


让我们假设一个X86环境,因为我怀疑该行为可能是体系结构,甚至可能是特定于模型的。

来自《英特尔体系结构手册》第3A卷:

访问跨缓存线拆分的可缓存内存和 Intel Core 2不保证页面边界是原子的 Duo,英特尔®;Atom™, 英特尔酷睿双核、奔腾M、奔腾4、英特尔至强、, P6系列、奔腾和Intel486处理器


IMO not atomic意味着您描述的场景可能会发生。在写入前2个字节后,可以生成中断。

IIRC,整个写入过程因故障而中止。如果您想仔细检查,英特尔x86手册应该详细记录这一点。对此不太确定,但IIRC AVX512屏蔽存储实际上可能会在发生故障之前存储一些(非故障)元素。我刚刚查看了ISA ref手册中的分散指令,但他们没有这样说:分散指令按指定顺序检查故障。(但对于分散的单个元素,如果它出现故障,它根本就没有完成。)如果有任何体系结构允许非故障页面的部分存储通过,我会感到惊讶。顺便说一句,中有英特尔x86手册的链接。@PeterCordes-我没有检查AVX-512存储,但毫无疑问这就是它的工作原理。甚至AVX2采集也是这样操作的:它们在每次采集操作后(原则上无论如何)更新掩码寄存器,这样它们就可以被中断(我认为),因此如果抛出异常,加载的某些部分可能已经完成,掩码寄存器将反映这一点(因此可能会修复问题并重新启动加载)。毫无疑问,AVX-512的工作原理是一样的,如果散乱点不同,那就很奇怪了。但是,在页面分割的两个部分变得全局可见之前,必须完成对这两个部分的权限检查,除非我对它的工作原理有误。我看不到不同之处。非原子意味着其他部分(其他内核或总线)可以进行观察者部分写入,为什么同一个内核在中断发生时不能进行观察者部分写入?我认为当出现页面错误时,不会回滚部分写入。它使问题变得更复杂,却一无所获。这取决于总线传输是什么样子的,如果核心将其分成两个传输,或者它是一个单一的未对齐传输……当然,更简单的答案是试试看是吗?@Zang:所有这些微体系结构都已经在推测执行中出现问题。在从存储缓冲区提交到L1D缓存并全局可见之前,它们必须能够取消已执行的存储。这是不允许发生的,直到商店退休(即,发现所有以前的指令都已完成,没有异常或其他错误推测检测,本指令的所有部分也是如此。最常见的错误推测类型是分支预测错误,但也包括本指令和早期加载/存储错误。)@PeterCordes我明白了。由于Intel没有定义行为,行为是未定义的,部分写入可能会发生,也可能不会发生。非原子性至少意味着不能保证部分写入不会发生。但为了避免错误,我们总是期望最坏的情况会发生。我假设在执行工作时可能会发生。