1

私はアセンブラで小さなカーネルを書いています。QEMUで実行していますが、いくつかのバグに問題があります。ここで、dbg を使用してカーネルをデバッグします。だから私はそれを次のように組み立てました:

$ nasm -g -f elf -o myos.elf myos.asm
$ objcopy --only-keep-debug myos.elf myos.sym
$ objcopy -O binary myos.elf myos.bin

次に、QEMU で次のように実行します。

$ qemu-system-i386 -s -S myos.bin

次に、gdb に接続します。

$ gdb
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x0000fff0 in ?? ()
symbol-file myos.sym
Reading symbols from /home/sven/Projekte/myos/myos.sym...done.

welcome文字列を指すカーネルで名前が付けられたラベルがあります。テスト中にその文字列を調べようとしたところ、次の結果が得られました。

(gdb) x/32b welcome
0x1e <welcome>: 0x00    0xf0    0xa5    0xfe    0x00    0xf0    0x87    0xe9
0x26:   0x00    0xf0    0x6e    0xc9    0x00    0xf0    0x6e    0xc9
0x2e:   0x00    0xf0    0x6e    0xc9    0x00    0xf0    0x6e    0xc9
0x36:   0x00    0xf0    0x57    0xef    0x00    0xf0    0x6e

ラベルは次のように定義されます。

welcome: db "System started. Happy hacking!", 10, 0

ご覧のとおり、gdb はウェルカムが null バイトで始まるふりをしていますが、定義上はそうではありません。ただし、カーネルはラベルを正しく使用しているため、私のコードの問題ではないようです。メモリの他の部分を調べると、ロードされたカーネルとまったく一致しません。

マシンが正しく動作しているのに、仮想マシンのメモリがロードされたカーネルと一致しない理由を知っている人はいますか?

4

1 に答える 1