web-dev-qa-db-ja.com

Linuxカーネルが「Starting kernel ...」でハングする

組み込みデバイスでセキュアブートを有効にしました。問題は、私がこのモードで起動しているときに、プロセスが次の行の後にスタックしているように見えることです:

Starting kernel ...

u-bootがカーネルをメモリにコピーし、bootmコマンドを発行すると、.

デバッガーで、PCがyield命令でスタックし、その後にpc = pc-4への割り当てが続くことをキャプチャできます。つまり、本質的にループです。

Linuxをこれほど低いレベルで起動したことは一度もないので、どこから探し始めればよいかわかりません。ただし、セキュアモードでないときにカーネルイメージを正常に起動できたことに気付いたので、これはベンダーにとってより適切な質問かもしれません。

1)一般に、実行ハンドオフステージに関するUブート診断情報はどこにありますか?

2)どの時点で、実行は完全にカーネルに与えられますか?つまり、U-Bootが無効になるのはいつですか?

7
sherrellbc

次の手順を使用して、Linuxの初期のプリントのメモリをダンプできます。原因としては、カーネルが起動しているが、コンソールが初期化される前にハングしたことが考えられます。また、ubootのカーネルエントリポイントにプリントを配置し、制御がカーネルに渡されることを確認します。

System.mapファイルを見つけます。以下のコマンドを使用して、log_bufアドレスを特定します。

grep __log_buf System.map

これは次のようなものを出力します

c0352d88 B __log_buf

ボードをウォームブートします(RAMの内容は消去しないでください)。

Ubootで__log_buf(c0352d88)のメモリをダンプします。カーネルコンソールの出力をダンプします。そのため、完全なハングが発生する場所を特定できます。

2
Rajeshkumar

私は同じ問題に直面し、解決策を見つけました。問題は、u-boot structure fieldsizeを格納するuncompressed linux kernel.の1つにあります。u-bootは、linux kernelが後でサイズ変更に使用する非圧縮サイズをこのフィールドに入力していませんそのstackにより、システムは未定義の状態になります。

u-bootStarting kernel...メッセージを出力したら、カーネルが実行を引き継ぐためにu-bootがUncompressing Linux... done, booting the kernelを転送した後、次のメッセージはSMM Handlerになるはずです。kernelこの分野を探しています。 x86ベースのシステムで作業している場合、解凍は次のファイルディレクトリにあります。

Arch/x86/boot/uncompressed/head_32.S
Arch/x86/boot/uncompressed/piggy.S

解決策は、ここで最新のu-boot founを使用することです https://github.com/andy-shev/u-boot

ただし、カスタムu-bootを使用している場合は、このフィールドを探す必要があります。

1
Sachin Mokashi