我知道 BIOS 位于 ROM 中,并且制造商“通常”将其设计为指向“活动”存储设备的第一个扇区的第一个扇区或 CHS (0,0,1) *物理和 CHS (0,0,0) *逻辑,根据您对分区的偏好,它是 MBR 或 VBR。
按照惯例,引导扇区中是否存在适用于 x86-CPU 的 IBM PC 兼容引导加载程序,由引导扇区末尾(偏移量 0x1FE 和 0x1FF)的两字节十六进制序列 0x55 0xAA(称为引导扇区签名)表示。此签名表示至少存在一个可以安全执行的虚拟引导加载程序,即使它可能无法实际加载操作系统。
这启动签名识别引导加载程序使用双字节十六进制序列,所以我猜签名必须是同一扇区中的偏移量?因此,假设引导加载程序必须位于同一扇区中?
答案1
BIOS 尝试查找要启动的程序时发生的基本操作顺序是:
- 将您尝试从中启动的设备(HDD、SSD、软盘、光盘等)的第一个扇区(512 字节)加载到内存中
- 检查第511和第512字节是否分别为0x55和0xAA。
- 如果没有,请返回步骤 1 并尝试下一个设备,如果没有其他设备,则放弃。
- 如果是,则开始执行该扇区开头的代码,从而将控制权传递给(希望)引导加载程序/管理器。
你可能会发现OSDev wiki 页面上的启动顺序有用。MBR 页面还有一个有用的表格,解释了第一个扇区的布局。我在这里重新创建了它,并做了一些简化:
Offset | Size (bytes) | Description
0 | 436 | MBR Bootstrap (flat binary executable code)
0x1b4 | 10 | Optional "unique" disk ID
0x1be | 64 | MBR Partition Table, with 4 entries
0x1fe | 2 | (0x55, 0xAA) "Valid bootsector" signature bytes
请注意,BIOS 不一定会关注甚至知道磁盘 ID 或分区表。
答案2
BIOS 代码位于 ROM(或现在的 EEPROM)中。它从磁盘加载第一个扇区(LBA 表示法中的 #0 或 CHS 表示法中的 c=0,h=0,s=1),验证最后两个字节是否为 0x55 和 0xAA,然后将控制权转移到该扇区。
因此,MBR 实际上是已识别通过其地址 #0。而 55 AA 签名只是为了确认如果第一个扇区为零(对于新硬盘),BIOS 可以通过缺少 55 AA 签名来检测到这种情况,并尝试从另一个磁盘、PXE、ROM BASIC 或其他任何方式启动。
0x55 0xAA 不是 MBR 的偏移量,实际偏移量为零。