2016-10-23 39 views
0

所以我一直在尝试自己编写一个小引导程序(用于娱乐和教育)。到目前为止,我已经完成了一个与MSDOS完全相同的引导加载程序(或称为“可启动程序”)。然后,当我试图实现更多的东西,我超过了512字节的限制。我决定扩展我的小操作系统。我已经开始编写像2阶段的引导程序,其中阶段2的行为作为主要的内核,所以我会有超过512字节。FAT32查找阶段2引导程序

我写了我的引导程序的第一阶段。几乎。我想到跳到舞台2所在的区域来执行它,但问题是,我使用的是FAT32 USB,而不是那些人人都在编写代码和教程的软盘映像。

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

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

+0

你刚才足够的空间来写,可以通过FAT32主目录扫描并加载一个文件到内存中一个512字节的单块体积引导记录,这两个步骤需要你跟着他们FAT中的相应分配链。您需要为FAT32 BPB保留空间,因为这是文件系统元数据的一部分,但仍然留有足够的空间 –

+0

通过查看它的FAT条目并读取它,找出它在哪个扇区。 –

回答

0

OK,解决方案似乎是相当容易的(只要你知道你的第二阶段开始的二进制)。代替试图加载上扇区0200的二进制文件(其是FAT32的第二块),加载此部分一直作为它的工作在其他FAT分区的驱动器:

0x7E00:0×00

类型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