0

カスタム ハードウェア上の Linux カーネル 3.0.1 に基づいて、Android 4.0.1 (Ice Cream Sandwich) を起動しようとしています。

__enable_mmuシリアル ポートを使用して、head.S で定義された関数まで Linux カーネル 3.0.1 ブート プロセスをデバッグできます。

__turn_mmu_onしかし、関数が実行されるとすぐに、ブート プロセスをデバッグできません。

私は linux-arm-kernel メーリング リストのアーカイブを調べて、回避策を試しましたprintascii()。しかし、まだシリアル コンソールで起動ログを確認できません__turn_mmu_on

ここでは、以前にログを取得できた__turn_mmu_onので、シリアル コンソール ポートは正常に動作しています。

もう 1 つ、JTAG がありません。

MMUをオンにした後にLinuxカーネルのブートプロセスをデバッグする方法を誰かが解決策を提供できますか?

4

2 に答える 2

0

ほとんどの場合、メモリ変換の構成に問題があります。MMU をオンにした後、元のハードウェア アドレス (以前に使用していたもの) にマップされた仮想アドレスを使用して、シリアル デバイスにアクセスする必要があります。

問題をデバッグするには、正しい仮想アドレスが設定されていること、およびメモリ マッピング構成がデバイスのものであることを確認する必要があります。一般に、デバイスのメモリ マッピングは静的に行われるため、ソース ファイルのどこが間違っているのかがわからない場合は、 への呼び出しの直前に値を出力することもできます__enable_mmu

于 2014-01-28T14:09:31.013 に答える
0

-

こんにちは、あなたの質問についてはわかりませんが、いくつかの考えがあります。

Linux のソース コードでは、以下の点がいくつかあります。

/* * MMU を有効にします。これにより、可視
メモリ空間の構造が完全に変更されます。これを介して実行を追跡することはできません。
* これについて質問がある場合は、別の投稿をリストに送信する前に * linux-arm-kernel メーリング リストのアーカイブを確認してください。 * * r0 = cp#15 制御レジスタ * r1 = マシン ID * r2 = atags または dtb ポインタ * r9 = プロセッサ ID * r13 =完了時にジャンプする仮想アドレス * * 他のレジスタは、完了時に呼び出される関数によって異なります */ . align 5 .pushsection .idmap.text, "ax" ENTRY(__turn_mmu_on) ....













....
__turn_mmu_on_end:
ENDPROC(__turn_mmu_on)
.popsection

そのため、__turn_mmu_on が呼び出された後にフローをトレースできないのはごく普通のことのようです。

しかし、printascii() を使用した結果で、使用できない理由をデバッグしましたか?

printascii() が設定なしで使いやすいかどうか知っていますか? 使用前に必要な設定はありますか?実行可能な環境を提供しましたか?

JTAG がないため、残っている唯一の方法は印刷である可能性があるため、printascii() のデバッグは必須です。

ありがとう。

于 2012-09-27T03:29:05.517 に答える