私はアセンブラで小さなカーネルを書いています。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 バイトで始まるふりをしていますが、定義上はそうではありません。ただし、カーネルはラベルを正しく使用しているため、私のコードの問題ではないようです。メモリの他の部分を調べると、ロードされたカーネルとまったく一致しません。
マシンが正しく動作しているのに、仮想マシンのメモリがロードされたカーネルと一致しない理由を知っている人はいますか?