5

Qemuを使用してLinuxカーネルの開発/ハッキングを学び、Linux(2.6.34.3)のブートプロセスをデバッグしたいと考えています。私はARMの用途の広いプラットフォーム用にコンパイルし、Codesourcerysarm-none-eabiクロスコンパイラーを使用しています。gdbserverを使用してビルドおよびデバッグするための環境としてEclipseを使用しています。

そのため、qemuでカーネルを正常にビルドして実行するように管理しましたが、問題は、ブートプロセス(アドレス0)でデバッガーにソースコードが表示されず、逆アセンブリコードしか表示されないことです。ただし、init / main.c(0xC0000000を超えるアドレス)で仮想メモリに切り替えると、ソースコードが表示され、ソースコードを確認して、コードをステップスルーできます。何故ですか?最初からそれが欲しいです。

Linuxの起動プロセスをデバッグする方法に関するヒントはありますか?グーグルのすべてのガイドはカーネルをデバッグする方法を示していますが、それらはすべてstart_kernel()(init / main.cにあります)から表示され、ブートプロセスの最初(arch / arm / boot / compressed / head)からは表示されません。 S)。経験のある方はどうぞよろしくお願いします!

ルートフォルダのSystem.mapを調べたところ、c0004000(仮想アドレスが開始する場所)からのもののシンボルのみがあります。デバッグ情報を取得するためにvmlinuxをgdbserverにロードします。おそらくそれがソースがない理由ですか?

4

3 に答える 3

7

Linuxカーネルは2ステップのブート処理を使用します(これにはu-Bootのようなブートローダーは含まれません...)。特に2つの.ldsファイル(詳細は以下)を調べてリンクすることで、これをよりよく理解できます。

  1. arch/arm/boot/compressed/vmlinux.lds.in、を生成しarch/arm/boot/compressed/vmlinux.ldsます。

    内の他の.oファイルとともにarch/arm/boot/compressed、vmlinuxがこのフォルダー内に生成されます。

    arm-none-eabi-nm -a -n arch/arm/boot/compressed/vmlinuxこのステージのシンボルを表示するために使用できます。すべてのアドレスは物理アドレスです。

    これらのシンボルはSystem.mapに含まれていません

  2. 2番目のvmlinuxは、カーネルの.oファイルによって生成されますarch/arm/kernel/vmlinux.lds(注:パスは異なります)

これが、Eclipseで起動ソースコードが表示されない理由を説明していることを願っています。

于 2012-11-29T14:04:44.777 に答える
2

Linuxカーネルは複雑すぎて理解できません(初心者の場合)。xv6
のような小さなOSを使用しない理由:

OSは小さく、 ソースコードは V6(unix)に基づく
多くの大学で使用されている約8000行です。 起動プロセスは、Linuxよりも複雑でないことを除いて同じです。 xv6ブックの付録Bは、ブートプロセス(短くて甘い)を扱っています。qemuでgdbを実行して、ブートプロセスを確認できます。チェックアウトする主なファイルは、bootasm.S(アセンブラー内)とbootmain.cです。


これは、Linuxと比較すると、はるかに簡単で理解しやすくなっています(少なくとも初心者向けです)。与えられたリンクには、qemuの設定、gdbの使用、ブートプロセスの追跡、ソースコードの変更などがあります。試してみます :)

乾杯、
シャラン

于 2012-07-11T02:20:04.787 に答える
0

head.Sは、Cではなくアセンブリで記述されます。これは、.Sサフィックスが示すものです。

于 2012-07-11T00:33:44.260 に答える