我正在编写一个简单的引导程序(希望很快能编写一个操作系统)。我一直在取得进展,但这部分有点难倒我。
我正在将此操作系统和引导加载程序写入磁盘映像,其中包括:
- MBR 引导扇区和第一阶段引导加载程序
- 为第二阶段引导加载程序保留 32kb 区域
- 一个包含操作系统的 FAT32 分区,以及
kernel.bin
我的目标是将 kernel.bin 加载到内存中并跳转到该位置,为了做到这一点,我必须遍历 FAT 表。
读取 FAT32 分区所涉及的许多逻辑需要 32 位值(如许多 BPB 值)
由于我现在基本上处于实模式,因此我不确定在执行乘法等计算时如何处理这些 32 位数字。我知道我可以使用操作数大小前缀和/或地址大小前缀来使用 32 位寄存器,但我无法以有意义的方式对它们进行算术运算。
例子
以下是存储来自 BPB 的重要值的汇编部分:
BPB_info:
; BPB info from the FAT32 boot sector
BPB_NumFATs: db 0 ; Number of FATs (1 byte)
BPB_FATSz32: dd 0 ; Size of each FAT in sectors (4 bytes)
BPB_RootClus: dd 0 ; First cluster of the root directory (4 bytes)
BPB_SecPerClus: db 0 ; Sectors per cluster (1 byte)
BPB_RsvdSecCnt: dw 0 ; Reserved sectors count (2 bytes)
; Calculated values used in the bootloader
FAT_root_dir_start: dq 0 ; Start of the root directory in sectors (calculated)
FAT_lba: dq 0 ; Logical block address of the FAT tables (calculated)
为了计算FAT_root_dir_start
,我必须使用以下公式:
BPB_RsvdSecCnt + ((BPB_RootClus - 2) * BPB_SecPerClus)
但由于BPB_RootClus
是一个双字(32 位),我不确定如何执行此操作。
任何建议都将不胜感激!我走对路了吗?我应该完全不同地处理这个问题吗?也许切换到保护模式?我不确定。