【问题标题】:FAT32 Finding Stage 2 BootloaderFAT32 寻找第 2 阶段引导加载程序
【发布时间】:2016-10-23 15:56:32
【问题描述】:

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

我已经编写了引导加载程序的第一阶段。几乎。我有了跳到stage 2所在扇区执行它的想法,但问题是,我使用的是FAT32 USB而不是每个人都在为其编写代码和教程的软盘映像。

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

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

【问题讨论】:

  • 你只有足够的空间来写一个 512 字节的单块卷引导记录,它可以扫描 FAT32 主目录并将文件加载到内存中,这两个步骤都需要你遵循它们各自的分配链胖的。您需要为 FAT32 BPB 保留空间,因为这是文件系统元数据的一部分,但这仍然留下了足够的空间
  • 通过查看它的 FAT 条目并读取它来找出它所在的扇区。

标签: assembly kernel bootloader


【解决方案1】:

好的,解决方案似乎相当简单(只要您知道第二阶段二进制文件从哪里开始)。与其尝试在扇区 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 

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 1970-01-01
    • 2016-03-22
    • 2019-08-24
    • 2015-11-18
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多