簡體   English   中英

調試QEMU中的早期內核啟動代碼

[英]Debugging early kernel startup code in QEMU

我將一些代碼(匯編和C的混合)編譯成ELF二進制文件,QEMU中的某些固件/引導加載程序代碼加載到特定的物理地址。 ELF使用虛擬地址鏈接; 但是,代碼是在關閉MMU的情況下運行的,這意味着它需要與位置無關。

問題是PC被設置為入口點的物理地址,這是有道理的,但由於所有符號都是使用虛擬地址引用的,因此GDB不知道入口點在哪里。

我仍然可以在MMU打開時調用的函數上設置斷點(因此PC將在那時處理虛擬地址),但這不足以調試早期代碼,包括單步執行它。

我已經能夠通過使用物理地址鏈接來調試此代碼,但顯然這會在我打開MMU時立即產生問題。

有誰知道我在這里缺少什么?

我不認為您的問題特別針對QEMU(甚至是ARM)。 我相信至少有三種方法可以解決這個問題,

  1. 只需使用匯編程序
  2. 使用symbol-file
  3. 疊加

匯編

我有這個問題,但只會切換到檢查匯編程序。 這是相當容易的,特別是如果你objdump -S的MMU /正常地址版本相匹配的匯編。 您可以將objdump輸出傳遞給文件,並根據需要刪除未重定位的代碼。 但是,大多數編輯器都能夠處理大文件。

查看匯編程序可能非常有用,因為通常某種重定位常量或非PIC類型引用不正確。 您需要兩個代碼/數據都是正確的,並且您的PIC代碼可能會調用一些gcc庫例程鏈接到您未考慮的某個位置。 因此雖然這是原始的,但它確實有一些優點。

符號文件

另一種方法是使用symbol-file 在引導期間使用帶symbol-file的物理鏈接,然后在MMU切換后使用MMU /普通鏈接的symbol-file 顯然加載MMU版本。

疊加

我認為你可以使用疊加來處理這個問題,盡管你實際上正在做反向。 VMA是MMU地址,LMA是物理引導地址。 將其標記為最初映射,然后在打開MMU時可以使用_ovly_debug_event()進行更新。

覆蓋采用代碼,但它是最方便的。 如果您已經在軟件開發系統中擁有“調試”構建目標並對該代碼進行了條件化,我會嘗試這樣做。 但是,如果您在ld使用實際疊加層,它實際上可能會解決您的一些問題,您可能會發現它最強大。 覆蓋資源影響非常小,但它存在。


參考

這些參考文獻是關於為什么要調試它的編碼問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM