📄 关于boot sector标准约定ver0.0.1.txt
字号:
1 结构
FAT16与 FAT32均遵循此结构,FAT12仅一扇区,非该结构约束之内。
typedef struct
{
UBYTE OtherBootCode[508]; //代码,508字节
UDWORD BootSectorFlags; //标志,4字节,总为 0xaa556146
}SECBYTE;
typedef struct
{
UBYTE FirstSector[512]; //首扇区,与原FAT系列结构一致
UBYTE OherSectors; //除首、次扇区外,剩余几个引导扇区
UDWORD OtherInfo[6]; //引导代码最多可以有8个扇区
UBYTE SecendCode[483]; //代码
UDWORD BootFlags; //标志,4字节,总为 0xaa556146
SECBYTE OtherSect[6]; //剩余扇区
}BOOTSECTs;
说明:
BOOTSECTs.FirstSector 为首扇区,其数据结构与原 FAT16(FAT32) 一致,大小为 512字节,标
志为 0xaa55。该扇区仅负责读出第2扇区内容,并检测扇区标志,然后
并移交CPU控制权。
BOOTSECTs.OherSectors 次扇首字节,用于说明该版本引导代码共占几个扇区,最多支持 8扇区
BOOTSECTs.OtherInfo 剩余扇区信息,次处用于存放剩余扇区的绝对扇区号,24字节,每单元
占用4字节,至多6个。
BOOTSECTs.SecendCode 次扇区代码部分,该部分代码负责读出剩余扇区,并判断引导标志的有
效性,然后转交控制权。
BOOTSECTs.BootFlags 标志,长度:4字节,总为: 0xaa556146
BOOTSECTs.OtherSect 剩余扇区,功能:
1: 加载系统内核
加载 KERNEL.SYS 到 1000:0000
加载 FS.DRV 到 5000:0000
2: 错误处理
如若出错,将尾扇区的错误信息
字模打印到屏幕,更换字模即可支持
任何语种。
名词:
首扇区: 引导代码的第一个扇区,BIOS今加载该扇区至内存0000:7C00
次扇区: 引导代码的第二个扇区,负责加载剩余扇区
尾扇区: 引导代码的最后一个扇区,无代码,仅为16点阵字模及文本信息
剩余扇区: 除首、次扇区外的其他引导扇区(包括尾扇区),即:从第三扇区开始的所有扇区。
2 变量、常量及宏的约定名:
常量或变量名 取值 说明
Seg_CS_Boot 0x1000 ;常量,KERNEL.SYS代码段地址
Seg_FS_Boot 0x5000 ;常量,FAT16.DRV代码段地址
Reg_IP_Base 0x7C00 ;常量,引导扇区代码在内存中的偏移地址
Flag_Offset 0x1fc ;常量,引导扇区标志偏移地址
Flag_BootSect 0xaa55 ;常量,引导扇区标志字
SomeBootSectors ? ;变量,引导程序共占几个扇区
fNameSize 11 ;常量,文件名长度为11字节
COUNT_Retry 5 ;常量,发生错误的重试次数
3 关于 language.inc
注意,language.inc并不是一个 inc 文件,而是一组。其中包含各种语言信息的字
模,和字符的特殊编码。这种编码非已有的任何一种方式,比如:BIG5、GB2312、UTF-8
等等。它的编码规则如下:
1: 字符分双字节编码和单字节编码,单字符编码与 ASCII 码相同
2:每字符串单独编码,若为 ASCII 码则不计入编码表,若为单字
节编码则编码表增 1。
3:字符串不出现重复字码,即使字模相同。
4:至多支持128个字模。
在 language.inc 中,每一个 INC文件必须有以下 2个宏:
DISKERRMSGDOT 包含磁盘错误信息的字模和编码表
字模的标号为: disk_dot
编码表标号为: ERR_DSK,以 '!' 结束
ERRORMESSAGEDOT 包含其他错误信息的字模和编码表
字模的标号为: Other_dot
编码表标号为: ERR_KNL(KERNEL.SYS出错)
ERR_DRV(FS.DRV出错)
注:'?'为不确定值
4 内存格局
; |-----------------------|0000:0000
; | |
; | 中断向量表 |
; | |
; |-----------------------|0000:0400
; | BIOS数据区 |
; |-----------------------|0000:0500
; | |
; | |
; | |
; | |
; | |
; | 堆栈区域 |注:所有变量及引导文件的 FAT信息都将存放在
; | | 堆栈区域中。这些变量包括:
; | | Startfat
; | | StartRoot
; | | StartData
; | | RootSectors等等
; | |
; | |
; | |
; | |
; | |
; |-----------------------|0000:7C00
; | 首扇区 |
; |-----------------------|0000:7E00
; | 次扇区 |
; |-----------------------|0000:8000
; | 其他扇区 |
; |-----------------------|0000:8400 ;注:Beta 0.0.01版本为4扇区
; | |
; | 空--未使用 |
; | |
; |-----------------------|1000:0000
; | |该地址区域在装载文件之
; | OSLOADER.SYS |前用于临时存放 FAT 表
; | |及根目录文件登记表等
; |-----------------------|2000:0000
; | FS.DRV |
; |-----------------------|
; | |
; | |
5 寄存器约定
EAX 存放临时数据,如:文件FAT信息、磁盘扇区记数等。
EBX 读磁盘时用于存放偏移地址
ECX 用于计数,如未出错,通常为0
BP 用于变量寻址,恒等于 0x7C00
SS 始终等于 CS
CF 发生错误为1,正确为0
6 出口:
dl 等于驱动器号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -