まず、デバッグのヒントを探しています。変更する1行のコードまたは問題を解決するために設定する1つの周辺設定ビットを指摘できる人がいれば、それはすばらしいでしょう。しかし、それは私が望んでいるものではありません。私はそれをデバッグする方法をもっと探しています。ARM Linuxカーネル(msleep())をデバッグするにはどうすればいいですか?
グーグル "msleepハングlinuxカーネルサイト:stackoverflow.com"は13の答えを返しますが、何も意味がないので、私は質問するのが安全だと思います。
組み込みTI AM1808 ARMプロセッサ用のARM Linuxカーネル(Sitara/DaVinci?)を再構築します。シリアル・ポートから出てくるログイン:プロンプトまでのすべてのブート・ログが表示されますが、ログインしようとすると応答がなくなり、入力したものがエコーされなくなります。
多くのデバッグの後、私はカーネルに到着し、828行目と830行目の間にデバッグコードを追加しました(カーネルバージョンは2.6.37です)。私は永遠にループのprintkを追加し、私は結果を参照してください右ライン830の前に
http://lxr.linux.no/linux+v2.6.37/init/main.c#L815
:これは「sbinに/ initを」前に、カーネルモードでこの点にあると呼ばれています。私はそれを約2時間実行させ、それは約200万に数えます。サンプル行:
dbg:init/main.c:1202: 2088430
したがって、問題なしで6000万バイトを吐き出しました。
しかし、ループにmsleep(1000)を追加すると、msleep()は返されません。
詳細:
: は上記永久テストループの開始時に設定され得るフラグに関する条件は、それがハングアップしたときにスケジュールを()はもはや呼び出されることを示していないことをスケジューラにライン4073で条件付きのprintkを追加http://lxr.linux.no/linux+v2.6.37/kernel/sched.c#L4064
の.config/'デバイスドライバ' の下の唯一の選択肢は以下のとおりです。 ブロックデバイス I2Cサポート SPIサポート
カーネルとRAMディスクはloadeですd uboot/TFTPを使用します。 私はそれがイーサネットを使用しようとしているとは思わない。 これらはすべて '/ sbin/init'の前に起こったので、ほとんど起こってはいけません。
詳細: 私は同じCPUを持つ非常に似たボードを持っています。私は同じuImageと同じramdiskを実行することができ、そこではうまく動作します。私はログインして通常のことをすることができます。
私はメモリテストを実行しました(合計64MB、カーネルを32Mに制限し、もう1つの32Mをテストしています;これはシングルチップDDR2です)、問題は見つかりませんでした。 1つのボードがUART0ともう1つのUART2を使用しますが、ブートログが両方から出てくるので、問題ではありません。
どのようなデバッグのヒントもありがとうございます。 私は適切なJTAGを持っていないので使えません。
スケジューラがハードウェアタイマーに依存している可能性がありますか?それはおそらく壊れていますか?または異なるioアドレスを使用していますか? –
私が知る限り、シリアルポート以外のすべての環境が同じであるように、すべてがチップ上になければなりません(すべて3つがアクティブで、どちらがアクティブなのかを選択する必要があります)。タイムティックIRQを探してそこにprintkを追加してください(もし私がそれを見つけることができたら:) – user1261470