自制OS启动报错:KERNEL.BIN未找到,请求技术协助
FAT12文件系统与KERNEL.BIN加载问题排查
1. 镜像生成环节检查
- 确认Makefile是否正确将
KERNEL.BIN写入FAT12镜像:- 检查Makefile中镜像生成步骤,是否包含类似
mcopy -i disk.img KERNEL.BIN ::KERNEL.BIN的拷贝命令,确保文件被正确写入镜像。 - 手动验证镜像内容:Linux下用
mount -o loop disk.img /mnt/tmp挂载镜像,查看/mnt/tmp下是否存在KERNEL.BIN,且文件大小和编译输出的KERNEL.BIN完全一致。
- 检查Makefile中镜像生成步骤,是否包含类似
- 核对BPB参数一致性:确保bootloader中硬编码的FAT12参数(每扇区字节数、每簇扇区数、根目录项数等)和镜像引导扇区的BPB参数完全匹配,参数不匹配会直接导致文件系统解析失败。
2. Bootloader文件读取逻辑检查
- 根目录读取逻辑验证:
- 根目录起始扇区计算是否正确:公式为
根目录起始扇区 = 保留扇区数 + FAT表数×每个FAT表的扇区数,必须和BPB参数对应。 - 文件名匹配逻辑:FAT12采用8.3大写格式,检查代码是否将目标文件名转为大写后再对比,有没有忽略扩展名或文件名长度处理错误。
- 根目录起始扇区计算是否正确:公式为
- FAT链与数据簇读取检查:
- 起始簇转扇区计算是否正确:
数据区起始扇区 = 根目录起始扇区 + 根目录占用扇区数,根目录占用扇区数公式为(根目录项数×32 + 每扇区字节数 -1) // 每扇区字节数。 - FAT12簇号拼接是否正确:FAT12每个簇号占12位,检查代码中是否正确处理了相邻两个字节的高低位拼接,避免簇号解析错误导致无法定位文件数据。
- 起始簇转扇区计算是否正确:
3. KERNEL.BIN编译链接检查
- 确认输出格式:确保链接脚本指定生成纯二进制文件,编译步骤包含
objcopy -O binary kernel.o KERNEL.BIN,避免生成带ELF头的文件导致镜像识别异常。 - 文件大小验证:FAT12根目录单文件大小有上限(1.44M软盘环境下建议不超几十KB),检查
KERNEL.BIN大小是否超出处理能力,若过大需确认FAT链遍历逻辑是否支持多簇文件。
4. QEMU启动与调试
- 启动参数核对:确认QEMU启动命令使用的是最新生成的镜像,比如
qemu-system-i386 -fda disk.img,避免启动旧版本镜像导致的问题。 - 调试输出补充:在bootloader中添加调试打印,比如遍历根目录时打印每个目录项的文件名,找到目标文件时打印起始簇号,快速定位是目录项未找到还是数据读取失败。
- QEMU调试工具:用
qemu-system-i386 -fda disk.img -s -S启动镜像,再通过GDB连接target remote localhost:1234单步调试,查看寄存器和内存数据是否符合预期。
内容的提问来源于stack exchange,提问作者AceBlaz
相关产品推荐
相关产品推荐

