我正在撰寫一個頁面錯誤處理程式,我想知道如果 ISRcr2在 ISR 回傳之前更改right的值會發生什么。
例如,如果某些代碼執行此操作:
mov rax,QWORD PTR [rip 0x23]
mov rbx,QWORD PTR [rax 0x28432]
movabs rax,0xdeadbeefdeadbeef
mov rcx,QWORD PTR [rax]
假設將設定中[rax 0x28432]的Present位PTE設定為0。我們還假設0xdeadbeefdeadbeef指向有效但已調出的記憶體。
假設代碼是 ISR(這是偽代碼):
PPTE pte = GetPteFromVA(__readcr2() & ~0xFFF);
/* Bring page into memory */
pte->Present = 1;
__writecr2(newValue);
__asm
{
add rsp, 8
iretq
}
代碼中會發生什么?加載rbx一個值的指令會cr2在其計算中使用更新的值嗎?嘗試加載指向rcx的值時會發生什么rax?是cr2僅用于通知出錯地址的內核?或者會有什么東西壞掉?
uj5u.com熱心網友回復:
在頁面錯誤處理程式回傳后,重新執行錯誤指令。假設故障處理程式保留所有暫存器值,這是必須的,當指令重新執行時,它將嘗試再次訪問相同的地址。不使用 CR2。
只有在第一個頁面錯誤解決并且記憶體訪問完成后,后續指令上的頁面錯誤才會發生。假設您將 0xdeadbeefdeadbeef 更改為規范地址,您將在 rcx 加載時遇到第二個頁面錯誤,這與 rbx 加載時的頁面錯誤完全無關。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392657.html
上一篇:用于鎖定或的C內置或行內匯編
