Bootloader是否始终在扇区0?ISO引导相关技术疑问
操作背景
- 编写
bootloader.asm,通过以下命令生成二进制文件:nasm -f bin bootloader.asm -o bootloader.bin - 生成1.44MB零填充镜像,并将Bootloader写入镜像扇区0:
dd if=/dev/zero of=bootloader.img bs=1024 count=1440 dd if=bootloader.bin of=bootloader.img seek=0 count=1 conv=notrunc - 生成带El Torito扩展的可引导ISO:
genisoimage -quiet -V 'hashidaOS.iso' -input-charset iso8859-1 -o hashidaOS.iso -b bootloader.img -hide bootloader.img iso/
现象:虚拟机可正常启动,但通过hexdump -C hashidaOS.iso或dd if=HashidaOS.iso bs=512 count=1 | xxd查看,发现ISO的扇区0为全零。
问题与解答
1. 可引导存储的Bootloader是否始终位于物理扇区0?
不是。仅传统MBR格式的硬盘/软盘要求Bootloader放在第一个物理扇区(扇区0);但El Torito格式的可引导ISO中,Bootloader的位置由ISO内的El Torito扩展记录指定,并不在ISO的扇区0。
2. Oracle VM如何获取不在ISO扇区0的Bootloader?
Oracle VM(VirtualBox)会读取ISO中的El Torito引导目录,该目录记录了Bootloader镜像在ISO内的位置、镜像类型(如软盘/硬盘镜像)等信息。虚拟机BIOS会依据这些信息定位到对应的Bootloader镜像并加载,而非直接读取ISO的扇区0。
3. Oracle VM是否像真实BIOS一样使用INT 19h加载Bootloader,且仅加载存储的扇区0?
虚拟机BIOS会模拟真实BIOS调用INT 19h处理引导,但并非仅加载扇区0。针对El Torito ISO,INT 19h的处理逻辑会先读取ISO的El Torito引导信息,找到指定的Bootloader镜像位置,再加载该镜像的扇区0(即你写入bootloader.img的扇区0)到内存执行,而非ISO文件本身的扇区0。
4. 扇区0无代码是否与ISO El Torito规范相关?
是的。El Torito规范的可引导ISO中,扇区0仍为传统MBR区域,但无需包含Bootloader代码。El Torito扩展通过在ISO特定位置存储引导目录,告知BIOS真正的Bootloader镜像位置。你生成的ISO扇区0全零符合规范,因为虚拟机BIOS会通过El Torito信息找到嵌入的bootloader.img,并加载它的扇区0执行。
内容的提问来源于stack exchange,提问作者Worcnaz

