You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自制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完全一致。
  • 核对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:58:17