2016-04-14 11 views
5

qemu環境でGDBを使用して段階的にカーネルブートシーケンスを理解しようとしています。以下はqemuでGDBを使用してLinuxカーネルをデバッグすると、機能や特定のアドレスにヒットできない

私の設定です: -

他の端末

arm-none-linux-gnueabi-gdb vmlinux 
Reading symbols from vmlinux...done. 
(gdb) target remote :1234 
Remote debugging using :1234 
0x60000000 in ??() 

~/Qemu_arm/bin/qemu-system-arm -M vexpress-a9 -dtb ./arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel ./arch/arm/boot/zImage -append "root=/dev/mmcblk0 console=ttyAMA0" -sd ../Images/RootFS.ext3 -serial stdio -s -S 

を実行している端末のIMで私の質問は、/アーチ/腕にコードの設定方法ブレークポイントであります/ boot/compressed/*ファイル。

たとえば、misc.cで定義されたdecompress_kernelのブレークポイントを設定しようとしました。

ケース1:

(gdb) b decompress_kernel 
Function "decompress_kernel" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 2 (decompress_kernel) pending. 
(gdb) c 
Continuing. 

上記1のQEMUが起動される機能をヒットすることができません。

ケース2:この場合

(gdb) b *0x80008000 
Breakpoint 1 at 0x80008000: file arch/arm/kernel/head.S, line 89. 
(gdb) c 
Continuing. 

もその代わりにヒットすることはできませんQEMUは起動中です。

ケース3:

(gdb) b start_kernel 
Breakpoint 1 at 0x8064d8d8: file init/main.c, line 498. 
(gdb) c 
Continuing. 

Breakpoint 1, start_kernel() at init/main.c:498 
498 { 
(gdb) 

この場合、機能が当たっていると私はステップによって可能なデバッグ段階です。

注:私は、デバッグ、早期のprintkを有効にし、だから私のクエリはあなたがシンボルをロードしていないので、あなたがstart_kernelの前の任意の関数にブレークポイントを置くことができません

1)why some funtions are not able to hit break points? 
2)Is this qemu limitation or do i need enable something more ? 
3)do i need to append any extra parameters ? 
4)how to Debug early kernel booting 
+0

ちょうど関数が呼ばれているかどうかは不思議です。 printkを追加して、その関数が呼び出されていることを確認できますか? – Jeyaram

+0

@Jeyaram明らかに、関数は、一度カーネルが起動すると、汎用関数として "Uncompressing Linux ....... done、kernel"を呼び出す必要があります。これはdecompress_kernel()関数 –

+0

が同意したものです。それも私が混乱しているものです。しかし、カーネルイメージが圧縮されていないとどうなりますか?あなたは "Linuxの圧縮解除.......完了、カーネルの起動"というメッセージが表示されていますか? – Jeyaram

答えて

0

ある

をhbreak試してみましたそれら。実際には、カーネルのzImageを使ってqemuを起動していますが、vmlinuxからシンボルをロードしています。それらは同じではありません.zImageは基本的にvmlinuxでデータペイロードとして圧縮され、スタブに接続され、メモリ内のデータを解凍してからstart_kernelにジャンプします。

start_kernelはvmlinuxのエントリポイントで、decompress_kernelを含むそれ以前の関数はスタブの一部であり、vmlinuxには存在しません。

"arm-none-linux-gnueabi-gdb zImage"を実行するとスタブをデバッグできますか?実際のハードウェア上のJTAGデバッガを使用してARMカーネルの初期デバッグを行ったことがありますそれのためのqemu、申し訳ありません

+0

ありがとう、私はこの " linux-gnueabi-gdb zImage」を参照してください。好奇心のために、このvmlinuxにeveythingがあるように、私は/ arm/boot/compressed/vmlinuxの代わりにkernel proper(vmlinux)のvmlinuxを使うことができますか? –

+0

私はSystem.mapアドレスを見てBTWを見ています。私はブレークポイント、例えば0x80008000にブレークポイント1を置こうとしています:ファイルarch/arm/kernel/head.Sこのアドレスを打つことなくここにqemuが起動します。 –

+0

いいえ、/ arm/boot/compressed/vmlinuxは、コンパイルの中間製品です。生のバイナリではなく、シンボルや再配置情報を含むelfバイナリです。システムを起動することはできません。 –

関連する問題