我正在用汇编程序编写一个小内核。我在 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 假装 Welcome 以空字节开头,但根据定义它不是。但是内核正确使用了标签,因此我的代码似乎没有问题。检查内存的其他部分与加载的内核完全不匹配。
有谁知道为什么虚拟机的内存与加载的内核不匹配,而机器仍然正常运行?