2014-01-08 35 views
1

我試圖調試Apple的XNU內核的副本。我在VirtualBox中運行它,但每當引導加載程序將處理器的控制權轉交給XNU時,由於致命的硬件異常,VM監視器會中止執行。調查顯示,XNU尚未將PAE PDPTE中的保留位設置爲零。有人能告訴我這些保留位是什麼(最好是與PAE PDPTE的其餘部分有關)?彙編不是我的特長,而我正在努力調試這個問題。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

你確定它是PDPTE條目嗎?看起來像頂級PML4 – Leeor

回答

0

我在柏林的LinuxTag跟一個當時孫工程師一次,因爲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你有命令uuu 10拆卸未來(未來10)指令(S),t爲「跟蹤「DEBUG.COM-like(反彙編下一個命令,進入它,轉儲寄存器和接下來的3個命令),c16c32切換模式和d 0x1234 0x5678 16b(例如)在實模式地址1234:5678h處顯示16個字節(只需在32位模式下直接使用gdb的x命令)。

+0

我試過了;它沒有幫助。我仍然認爲XNU在這裏有問題。 – wjk

+0

我自己編譯了我的XNU。這些資源可在https://github.com/Andromeda-OS/Kernel獲得。另外,在我認爲崩潰來自於哪裏的情況下,沒有使用SSE擴展。我認爲這與將內核頁面表重定向到更高內存有關,然後將它們加載到'%cr3'中。 – wjk

+0

有問題的代碼文件可以在https://github.com/Andromeda-OS/Kernel/blob/master/osfmk/x86_64/start.s查看。 – wjk