FAT32查找第2阶段Bootloader

时间:2016-10-23 15:56:33

标签: assembly kernel bootloader

所以我一直在尝试自己编写一个小的引导程序(用于娱乐和教育)。到目前为止,我已经完成了一个与MSDOS完全相同的引导程序(或者更确切地说是“可引导程序”)。然后,当我尝试实现更多的东西时,我超过了512字节的限制。我决定扩展我的小操作系统。我已经开始编写类似2阶段引导加载程序的东西,其中第2阶段的行为是主内核,因此我将有超过512个字节。

我写过我的bootloader的第一个阶段。几乎。我想到跳到阶段2所在的扇区来执行它,但问题是,我使用的是FAT32 USB而不是那些每个人都在编写代码和教程的软盘图像。

我的问题非常幼稚:如何在FAT32文件系统中使用stage1.bin加载stage2.bin?

到目前为止,这对我没有帮助: Loading second stage of a bootloader

1 个答案:

答案 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