我以为我了解L1D写未命中是如何处理的,但仔细想想却让我感到困惑。
这是一个汇编语言片段:
;rdi contains some valid 64-bytes aligned pointer
;rsi contains some data
mov [rdi], rsi
mov [rdi + 0x40], rsi
mov [rdi + 0x20], rsi
Run Code Online (Sandbox Code Playgroud)
假设[rdi]
和[rdi + 0x40]
行在 l1d 中不处于 Exclusive 或 Modified 状态。然后我可以想象以下动作序列:
mov [rdi], rsi
退休。mov [rdi], rsi
尝试将数据写入 l1d。RFO 启动,数据放入 WC 缓冲区。mov [rdi + 0x40], rsi
退休(mov [rdi], rsi
已经退休,所以有可能)mov [rdi + 0x40], rsi
为连续的缓存行启动 RFO,数据被放入 WC 缓冲区。mov [rdi + 0x20], rsi
退休(mov [rdi …