所以我一直在尝试自己编写一个小的引导程序(用于娱乐和教育)。到目前为止,我已经完成了一个与MSDOS完全相同的引导程序(或者更确切地说是“可引导程序”)。然后,当我尝试实现更多的东西时,我超过了512字节的限制。我决定扩展我的小操作系统。我已经开始编写类似2阶段引导加载程序的东西,其中第2阶段的行为是主内核,因此我将有超过512个字节。
我写过我的bootloader的第一个阶段。几乎。我想到跳到阶段2所在的扇区来执行它,但问题是,我使用的是FAT32 USB而不是那些每个人都在编写代码和教程的软盘图像。
我的问题非常幼稚:如何在FAT32文件系统中使用stage1.bin加载stage2.bin?
到目前为止,这对我没有帮助: Loading second stage of a bootloader
答案 0 :(得分:0)
好的,解决方案似乎相当简单(只要知道第二阶段二进制文件的起始位置)。而不是尝试在扇区0x0200(这是FAT32的第二个块)上加载二进制文件,加载此部分已经工作,因为它在其他FAT分区驱动器上工作:
0x7E00:0x00
FAT文件系统的类型似乎并未影响其指向的位置。 另外,我的另一个问题是关于第二阶段。它应该有
[ORG 0x0000]
在开始。
最终代码:
[BITS 16]
[ORG 0x7C00]
Boot:
xor ax, ax ; AX=0
mov ds, ax ; DS=0
mov es, ax ; ES=0
add ax, 0x9000
mov ss, ax
mov sp, 0xF000
mov ah, 0x00
int 0x13
mov ax, 0x7E00
mov es, ax ; Load to 0x7E00 : 0x00
mov bx, 0x00
SurucuOku:
mov ah, 0x02
mov al, 0x01 ; Read 1 sector
mov ch, 0x00 ; Read on cylinder 0
mov cl, 0x02 ; Read sector 2
mov dh, 0x00 ; Head number 0
int 0x13
jnc Basari
mov al, 0x46
call hata
jmp SurucuOku
hata:
pusha
mov ah, 0x09
mov bh, 0x00
mov bl, 0x0F
mov cx, 0x01
int 0x10
popa
ret
Basari:
jmp 0x07E00:0x00
TIMES 510 - ($ - $$) db 0
DW 0xAA55