gpt4 book ai didi

x86 - 断点在宽松内存模型上的行为

转载 作者:行者123 更新时间:2023-12-04 08:16:26 24 4
gpt4 key购买 nike

Init: int x = y = 0;

thr1 thr2
---- ----
y = 1; x = 1; WRITE to global variables
a = x; b = y; READ from global variables
print(a); print(b);

上面运行在TSO内存模型下的代码片段中,众所周知,两个线程都可以打印 0同时因为 CPU 可以重新排序指令以在写指令之前执行读指令(即线程的第二行)。
那么,我们在读指令上插入断点,遇到断点就继续执行,会发生什么?仍然可以两个线程打印 0同时,还是断点会阻止重新排序?
我假设 x86-64 架构和 x86-TSO 内存模型。如果给出体系结构(或内存模型)之间的任何差异,将不胜感激。
另外我猜硬件断点和软件断点不会对结果产生影响(因为它们都会触发异常,并且 x86 架构类似地处理它们)。这个猜测正确吗?

最佳答案

对于与 https://preshing.com/20120515/memory-reordering-caught-in-the-act/ 相同的情况,我认为这是汇编的伪代码(不是 C,在那里可能会发生大量编译时优化)其中 StoreLoad 重新排序将可见。
带有立即返回的断点处理程序的断点只是序列化指令(如 CPUID 或 IRET)的一个非常昂贵的替代方案,它确保所有先前的指令都已执行,并且所有先前的存储都已提交到一致的缓存(即耗尽存储缓冲区)。
这样做的原因是从断点返回可能会涉及IRET ,这是一个序列化指令。 (像 MFENCE 但也序列化乱序 exec)。
所以是的,断点是其他线程观察到的内存重新排序的完整障碍。
这适用于硬件断点或软件断点,其中调试器必须恢复原始指令的第一个字节才能正常执行,而不是 0xcc int3软件断点。

关于x86 - 断点在宽松内存模型上的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65679691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com