ubicaciones de memoria incorrectas al depurar en qemu con gdb
Estoy escribiendo un pequeño núcleo en ensamblador. Lo estoy ejecutando en QEMU y tengo algunos problemas con algunos errores. Ahora quiero depurar el kernel con dbg. Entonces lo ensamblé así:
$ nasm -g -f elf -o myos.elf myos.asm
$ objcopy --only-keep-debug myos.elf myos.sym
$ objcopy -O binary myos.elf myos.bin
Luego lo ejecuto en QEMU con:
$ qemu-system-i386 -s -S myos.bin
Luego me conecto con 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.
Tengo una etiqueta llamadawelcome
en mi kernel que apunta a una cadena. Mientras probaba, traté de mirar esa cadena, que dio el siguiente resultado:
(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
La etiqueta se define así:
welcome: db "System started. Happy hacking!", 10, 0
Como puede ver, gdb está fingiendo que la bienvenida comienza con un byte nulo, pero por definición no lo es. Sin embargo, el núcleo utiliza la etiqueta correctamente, por lo que no parece un problema con mi código. Examinar otras partes de la memoria no coincide en absoluto con el núcleo cargado.
¿Alguien sabe por qué la memoria de la máquina virtual no coincide con el núcleo cargado, mientras que la máquina todavía se comporta correctamente?