像 LOCK DEC
这样的 x86 指令是否可以跨越多个缓存行,还是会导致段错误?
我只是想知道它们是否被允许这么做,而不是它们是否应该这么做。
(我知道某些 SSE 指令必须对齐到缓存边界)
像 LOCK DEC
这样的 x86 指令是否可以跨越多个缓存行,还是会导致段错误?
我只是想知道它们是否被允许这么做,而不是它们是否应该这么做。
(我知道某些 SSE 指令必须对齐到缓存边界)
是的,这是允许的。您也可以尝试一下。或者阅读指令集参考:
LOCK前缀的完整性不受内存字段对齐的影响。内存锁定适用于任意未对齐字段。
但请注意:
异常
#AC(0):如果启用对齐检查并且在当前特权级为3时进行了不对齐的内存引用。
请注意,通常不会启用对齐检查。
允许使用锁定,但可能会导致性能严重降低,因为锁定可能无法在缓存内维护,并可能降级为完整的总线锁定(实际上是完全系统停顿)。
在 Intel 486 处理器时代,锁定前缀用于在总线上断言锁定,但性能大幅下降。从 Intel Pentium Pro 架构开始,总线锁变成了缓存锁。如果锁定位于不可缓存的内存中或者超过缓存行边界分割缓存行,则现代架构中仍然会在总线上断言锁定。这两种情况都不太可能发生,因此大多数锁定前缀将转换为缓存锁,后者要便宜得多。
根据处理器规格可能会有所不同,但请注意另一个考虑因素是越过行边界也可能意味着越过页面边界,这更难以维护(因此更有可能降级)。