※ 引述《s25Ag5d4 (function(){})()》之銘言:
: (刪)
: 1 ; rcx = kernel address
: 2 ; rbx = probe array
: 3 retry:
: 4 mov al, byte [rcx]
: 5 shl rax, 0xc
: 6 jz retry
: 7 mov rbx, qword [rbx + rax]
: 在第四行會產生一個例外,但因為 OOOE 與推測執行,造成第
: 七行的讀取記憶體行為也執行了,它存取的資料被從記憶體中
: 搬入快取,但因為在第四行產生例外,因此 rbx 並沒有真的
: 被寫入資料。因為 rbx + rax 上的資料被移到快取了,它的
補充一下細節.
第四行一定會引發 exception,因為 user space application 不可以這樣
直讀取 kernel data。但是因為 OOOE 跟 superscalar,
line 4 之後的指令也一並被拆解為 micro-ops 充份利用 CPU 上的運算單元
最後等 line 4 和後面的 uOPs 做完 in-order 回到 architecture state,發現
line 4 會有問題才 raise exception,並且把已經 OOOE 多做的資料清掉跟準備
發出 exception。但是這時會有 race condition 產生.
雖然 line 4 不允許被執行,但是後面的因為 uOPs 已經做了,
rbx + rax 指向的資料已被搬進 cache。rbx 是自己程式記憶起頭,而 rax * 4096
就是 shift left 12, 避免預先讀進相鄰的 data 到 cache line
這時再利用以前的 paper 的 flush+reload 技巧把 cache 狀態讀出來
就可以知道 rcx 這個 byte 的值為何