问题描述
在实现my own boot sector loaders starting in 2012时,我确保将偏移量508和509的字节清零。这些是标准512字节大小的扇区的倒数第四个和倒数第三个字节。这是我放在这里的:
_fill 508,38,start
dw 0
; 2-byte magic bootsector signature
dw 0AA55h
我现在不记得任何具体的消息来源了,但是我相信我添加了两个零字节,以增强与某些或其他OS驱动程序的兼容性。在某些时候,我一定已经知道这可能是必需的。
在文档“ Microsoft可扩展固件倡议-fat32文件系统规范-FAT:磁盘格式的一般概述-版本1.03,2000年12月6日”中进行分页时,没有产生有关字节508和509的任何信息。 13它指出:
关于FAT卷的扇区0,还有另外一个重要说明。如果我们考虑一下 扇区作为字节数组,扇区[510]等于0x55,扇区[511]等于0xAA必须为真。
注意:许多FAT文档错误地指出此0xAA55签名占用了“最后2个字节” 引导扇区”。仅当且仅当BPB_BytsPerSec为512时,此语句才正确。 BPB_BytsPerSec大于512,这些签名字节的偏移量不会更改(尽管它是 完全可以,在引导扇区末尾的最后两个字节也包含此签名)。
最接近谈论字节508和509的是fat32的FSINFO结构的描述,在第22页:
FSI_TrailSig 508 4
值0xAA550000。该跟踪签名用于验证它实际上是FSInfo扇区。请注意,这的高2个字节 值-进入偏移量510和511的字节中-与 签名字节在扇区0中以相同的偏移量使用。
但是它没有指定整个双字应与引导扇区中的此签名匹配。
现代的FreeDOS引导扇区加载器does provide these two bytes as zeros:
times 0x01f1-$+$$ db 0
filename db "KERNEL SYS",0
sign dw 0xAA55
页面"An Examination of the MSWIN4.1 OS Boot Record"还将MS Windows 4.x引导扇区描述为两个字节均为零。在标题为“数据和 内存中的错误消息”,最后一行包含这些零:
7DF0 00 57 49 4E 42 4F 4F 54 20 53 59 53 00 00 55 AA .WINBOOT SYS..U.
这些零字节是有原因的吗?还是全部都是“邪教”的实例?
解决方法
仅回顾一下FreeDOS内核的所有引导扇区加载程序的状态,我就在另一个文件中提出了具体要求。在the LBA FAT32 loader中:
times 0x01ee-$+$$ db 0
msg_BootError db "No "
; currently,only "kernel.sys not found" gives a message,; but read errors in data or root or fat sectors do not.
filename db "KERNEL SYS"
sign dw 0,0xAA55
; Win9x uses all 4 bytes as magic value here.
,
V2引导扇区:
01F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA ..............U.
MS-DOS 3.2引导扇区:
01F0 00 00 00 00 00 00 00 00 00 00 00 00 00 80 55 AA ..............U.
IBM 4.01引导扇区:
01F0 4D 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA M.............U.
自从多年前确定该标准后,任何声称支持FAT的操作系统都无法更改规则。即使Win9x具有这些附加的零,您自己开发的引导程序也不需要这些相同的零就可以在任何情况下正常工作。
关于FreeDOS的奇怪案例。他们非常努力地成为所有人的朋友,无论过去还是将来。复制DOS错误的极端...