我正在尝试调试Apple的XNU内核副本。我在VirtualBox中运行它,但每当引导加载程序将处理器的控制权转移到XNU时,VM监视器由于致命的硬件异常而中止执行。调查显示XNU未将PAE PDPTE中的保留位设置为零。有人可以告诉我这些保留位是什么(最好是与PAE PDPTE的其余部分有关)吗?汇编程序不是我的强项,而我最终试图调试问题。
如果你想知道,我有以下C代码定义了用作PDPTE的数据:
#define PML4_PROT (INTEL_PTE_VALID | INTEL_PTE_WRITE)
pml4_entry_t BootPML4[PTE_PER_PAGE] __attribute__((section("__HIB, __bootPT"))) = {
[0] = ((uint64_t)(PAGE_SIZE) | PML4_PROT),
[KERNEL_PML4_INDEX] = ((uint64_t)(PAGE_SIZE) | PML4_PROT),
};
答案 0 :(得分:0)
我曾经在柏林LinuxTag与一位当时的Sun工程师谈过,因为MirBSD在VirtualBox中获得了GCC编译的x86代码(BSD gzip,没有内联asm或其他东西)的SIGILL。事实证明,他们知道他们的仿真是不完整和错误的(如果你启用硬件加速,但只是稍微好一点你不能轻松调试),他们知道它并且无法修复它(因为那样)即使没有修复,Windows®和Linux®也会花费很多钱。
我正在使用qemu进行自我调试,使用this ~/.gdbinit(对于16位或32位客户机;如果您的操作系统以64位运行,请注意gcc can crash when switching between 32-bit and 64-bit modes on the fly - 线程已链接不是我记得的确切链接,但也解释了问题),GNU屏幕和调用:
# screen tab 1
$ qemu -S -gdb tcp:127.0.0.1:1234 -m 64 -icount auto -hda foo.img
# screen tab 2
$ gdb
(gdb) qemu
(gdb) c16 # to switch display to 16-bit mode
(gdb) b *0x07C00 # to set a breakpoint on where the MBR will be loaded at
(gdb) c # to start the emulation
使用我的.gdbinit,您可以使用命令u
和uu 10
来反汇编下一个(接下来的10个)命令,t
到“跟踪”DEBUG.COM-like(反汇编下一个命令,进入它,转储寄存器和接下来的3个命令,c16
和c32
切换模式,d 0x1234 0x5678 16b
(例如)显示实际的16个字节模式地址1234:5678h(直接在32位模式下使用gdb的x
命令)。