我试图逐步完成本教程中显示的简单引导加载程序:http://mikeos.berlios.de/write-your-own-os.html - 所以我可以使用Qemu监视器检查通用寄存器以用于教育目的。
虽然我能够连接Qemu和gdb并且断点设置在引导加载程序的开头(0x7c0),但在gdb上点击“c”之后,代码一直运行到结束。
我读过kvm可能会“混淆”gbd和虚拟内存地址,所以我禁用了它。这没用。
我还读了(Debugging bootloader with gdb in qemu)在从HEAD编译gdb后调试Freedos引导时的工作。我没有重新编译gdb,而是尝试调试Freedos启动 - 它工作正常!
所以,我确实认为我的问题实际上是让教程的引导加载程序逐步执行。
我试过的其他事情(没有一个有效):
在插入断点之前使用几十个“si” 尝试不同的断点地址 在qemu上使用-singlestep键
这是我的qemu命令行:
qemu-system-i386 -fda disquete.img -boot a -s -S -monitor stdio
这是我在gdb中的命令序列:
(gdb)target remote localhost:1234 (gdb)设置架构i8086 (gdb)br * 0x7c0
然后我点击“c”,它只是一直通过断点。
版本:
$ uname -a
Linux Brod 3.8.0-30-generic#44-Ubuntu SMP Thu Aug 22 20:52:24 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux
$ gdb --version
GNU gdb(GDB)7.5.91.20130417-cvs-ubuntu
$ qemu --version
QEMU仿真器版本1.4.0(Debian 1.4.0 + dfsg-1expubuntu4),版权所有(c)2003-2008 Fabrice Bellard
由于我能够逐步完成Freedos启动,我相信我的设置很好,而且我必须在对本文开头提到的bootloader教程的启动过程的一些概念性误解中失败。
欢迎所有帮助!
答案 0 :(得分:2)
由于硬件虚拟化,可能需要使用硬件断点:
(gdb) hbreak *0x7c00
即使使用64位CPU(或kvm),也要注意gdb中的正确架构:引导加载程序需要(gdb) set architecture i8086
,因为CPU仍然处于实模式。
答案 1 :(得分:0)
我实际上能够调试我从mikeos.berlios.de/write-your-own-os.html获取的示例引导加载程序,然后将其重写为专门加载到0x7c00。我的信息来源(此处的贡献除外)是:
http://en.wikibooks.org/wiki/X86_Assembly/Bootloaders http://viralpatel.net/taj/tutorial/hello_world_bootloader.php
最终的代码是:
[BITS 16] ; Tells nasm to build 16 bits code
[ORG 0x7C00] ; The address the code will start
start:
mov ax, 0 ; Reserves 4Kbytes after the bootloader
add ax, 288 ; (4096 + 512)/ 16 bytes per paragraph
mov ss, ax
mov sp, 4096
mov ax, 0 ; Sets the data segment
mov ds, ax
mov si, texto ; Sets the text position
call imprime ; Calls the printing routine
jmp $ ; Infinite loop
texto db 'It works! :-D', 0
imprime: ; Prints the text on screen
mov ah, 0Eh ; int 10h - printing function
.repeat:
lodsb ; Grabs one char
cmp al, 0
je .done ; If char is zero, ends
int 10h ; Else prints char
jmp .repeat
.done:
ret
times 510-($-$$) db 0 ; Fills the remaining boot sector with 0s
dw 0xAA55 ; Standard boot signature
现在我可以逐步完成程序,看看寄存器在不断变化。