2012-09-24 24 views
0

我正在嘗試在自定義硬件上基於Linux內核3.0.1引導Android 4.0.1(冰淇淋三明治)。如何在__turn_mmu_on階段之後調試Linux內核的啓動過程?

我能夠使用串口調試Linux內核3.0.1的啓動過程,直到在head.S中定義的__enable_mmu函數爲止。

但是,只要__turn_mmu_on函數執行,我無法調試啓動過程。

我已經通過linux-arm-kernel郵件列表存檔&我已經嘗試過他們的printascii()解決方法。但是我仍然無法在__turn_mmu_on之後在串行控制檯上看到任何啓動日誌。

這裏我能夠在__turn_mmu_on之前得到日誌,所以我的串口控制檯端口工作正常。

還有一件事 - 我沒有JTAG。

任何人都可以提供解決方案如何調試Linux內核啓動過程後轉MMU?

+0

是否有不使用JTAG的特殊原因? (例如缺少頭部?)。目前基本的JTAG調試探針的代碼是相當低的,而且成本可能會低於你的時間。 – marko

+0

嗨,感謝您的回覆。但我們定製板的JTAG將在1個月後提供給我。所以,直到我得到一個JTAG,你能提供任何替代解決方案來調試這個。 – user1693508

回答

0

-

嗨,那裏,我不知道你的問題,但一些想法。

在Linux的源代碼

,有下面的一些點,

/* * 啓用MMU。這完全改變了可見內存空間的結構。你將無法通過它追蹤執行情況。
*如果您有任何疑問,請致電檢查linux-arm-kernel
*郵件列表存檔在發送另一篇文章到列表中。
*
* R0 = CP#15控制寄存器
* R1 =機器ID
* R2 = atags或DTB指針
* R9 =處理器ID
* R13 = 虛擬地址跳轉到結束時
*
*其他寄存器依賴於稱爲完成時
*/ .align僞5
.pushsection .idmap.text的功能, 「斧頭」
ENTRY(__ turn_mmu_on)
....
....
__turn_mmu_on_end:
ENDPROC(__ turn_mmu_on)
.popsection

所以,它看起來非常正常,你不能跟蹤後流__turn_mmu_on被調用。

但是,隨着你使用printascii()的結果,你調試了爲什麼它不能提供給你?

你知不知道printascii()是否容易使用,沒有任何配置?使用前有沒有必要的設置? 你提供了一個可運行的環境嗎?

由於缺乏JTAG,打印可能是唯一的方法,所以調試printascii()可能是你必須的。

謝謝。

+0

HI感謝您的回覆。但是我之前也在我們的一個項目中使用了printascii(),所以我有背景知識,說明printascii()需要所有內核配置。另外它還在Linux ARM郵件列表中提供。即使嘗試了所有這些,我仍然無法在串行控制檯上獲取任何數據。所以,如果任何上述問題的指針,這將是非常有益的。 – user1693508

0

很可能你有內存轉換配置問題。打開MMU後,串行設備必須使用映射到原始硬件地址的虛擬地址(您之前使用的地址)訪問。

要調試您的問題,您需要確保您擁有設置正確的虛擬地址,並且內存映射配置是設備的配置。通常,設備內存映射是靜態完成的,所以如果您無法看到源文件中出現了什麼問題,您還應該能夠在調用__enable_mmu之前輸出值。