如何在没有运行操作系统的情况下自行运行程序?你能创建计算机可以在启动时加载和运行的汇编程序,例如从闪存驱动器启动计算机并运行cpu上的程序吗?
我将在ARM体系结构上测试一些低级代码.通常实验板上的实验非常复杂,所以我在想QEMU.
我想得到的是某种调试信息,如printfs或gdb.我知道这对于linux很简单,因为它实现了QEMU Integrator的设备驱动程序和gdb功能,但我不使用Linux.我还怀疑从Linux内核源代码中提取这种功能会很复杂.
我正在从一些已经实现其中一个功能的简单操作系统中搜索.你有什么建议吗?
Freedos引导程序似乎存在问题.(在某些情况下,似乎bootcode无法找到内核.)
所以我试图用gdb调试qemu中的bootloader.按照几个维基上的说明和免费提供的在线课程资料,我像这样运行qemu
qemu-system-i386 -fda fdboot.img -boot a -s -S
Run Code Online (Sandbox Code Playgroud)
然后像这样连接gdb
$ gdb
(gdb) target remote localhost:1234
Run Code Online (Sandbox Code Playgroud)
我可以逐步完成前面的10 - 12条指令si,我假设它是SeaBIOS.
但过去,当我尝试进入引导加载程序代码时,它会继续执行而不会中断,一直到FreeDos菜单提示符.这完全跳过了我想在执行时逐步检查的引导加载程序代码.
我需要做什么才能通过引导加载程序?
[如果您想尝试自己,可以从项目网站下载freedos软盘映像.]
例如,使用BIOS打印a到屏幕的引导扇区main.asm:
org 0x7c00
bits 16
cli
mov ax, 0x0E61
int 0x10
hlt
times 510 - ($-$$) db 0
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)
然后:
nasm -o main.img main.asm
qemu-system-i386 -hda main.img -S -s &
gdb -ex 'target remote localhost:1234' \
-ex 'break *0x7c00' \
-ex 'continue' \
-ex 'x/3i $pc'
Run Code Online (Sandbox Code Playgroud)
我明白了:
0x7c00: cli
0x7c01: mov $0x10cd0e61,%eax
0x7c06: hlt
Run Code Online (Sandbox Code Playgroud)
所以看起来它mov ax, 0x0E61被解释为32位mov %eax并且将下一条指令int 0x10作为数据.
我怎么能告诉GDB这是16位代码?
也可以看看:
objdump" https://www.sourceware.org/ml/gdb/2007-03/msg00308.html,如下所示:如何反汇编原始x86代码?也许这是在实施的同时实施的?我为MBR部分编写了一个x86汇编程序.我编译如下:
nasm hellombr.asm -f bin -o hellombr.img
Run Code Online (Sandbox Code Playgroud)
然后我在qemu中运行它:
qemu -fda hellombr.img -boot a
Run Code Online (Sandbox Code Playgroud)
问题是我如何在源代码级别调试我的程序?
出于教育目的,我已经从mikeos.berlios.de/write-your-own-os.html改编了这个引导加载程序,将其重写为专门加载地址0x7c00.
最终的代码是这样的:
[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 …Run Code Online (Sandbox Code Playgroud) qemu ×6
assembly ×5
gdb ×5
debugging ×4
bootloader ×3
x86 ×3
arm ×1
disassembly ×1
embedded ×1
osdev ×1