我正在研究 QEMU 如何翻译原生基本块并运行它们。据我了解,它读取原生基本块然后重新翻译它们,但我想知道它如何处理内部异常,所以我运行以下程序:
// pgfault.c
int main() {
__asm__(
"xor rax, rax\n\t"
"mov rbx, [rax]\n\t"
"xor rcx, rbx\n\t"
"add rax, rcx\n\t"
);
}
// compile
x86_64-w64-mingw32-gcc pgfault.c -masm=intel -o pgfault.exe
// and run in PANDA/QEMU
确实,我得到了跟踪:
// first translation block
0x401510 xor rax, rax ; first instruction of main
; second instruction generates a page fault
// second translation block (KiPageFault in ntoskrnl.exe)
0xfffff80026e4600 push rbx
0xfffff80026e4601 sub rbp, 0x158
第二条指令产生一个页面错误,然后翻译块只包含第一条指令。QEMU/PANDA 如何提前知道(即在翻译步骤)?