我讀過《英特爾64和IA-3 2體系結構SDM卷3A,9.2內存排序》,但有一個問題一直困擾著我。
如果我首先寫入內存地址,然后用x2APIC發送處理器間中斷(IPI),這意味著發送IPI不需要寫入內存(只需使用wrmsr)。另一個核心接收IPI并讀取內存,它會讀取正確的值嗎?
For example:
最初x=0
Processor 0:
mov [ _x], 1
wrmsr # use x2APIC to send IPI
Processor 1:
# resive IPI, in the interrupt service routine:
mov r1, [ _x]
是否允許r1=0?
這是一個有趣的問題。從表面上看,人們可能會認為,由于
WRMSR
是一條序列化指令,它會刷新前面的內存寫入,一切都很好。即便如此,引用手冊:(Emphasis mine)
它沒有說明發送IPI的順序,因為這是當前指令的一部分,而不是下一個指令。因此,從理論上講,這意味著另一個核心可以執行
mov r1, [ _x]
,而始發核心仍然忙于刷新內容,但考慮到目標核心需要為可能具有更高延遲的中斷提供服務,這是非常不可能的。正如@harold提到的,這一點是沒有意義的,因為
WRMSR
并不總是序列化的。閱讀我最初遺漏的腳注:因此,絕對不能保證對
x
的寫入被刷新。