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

编译自定义OS时执行Makefile遇"init :: non DOS media"错误求助

自定义OS构建Makefile执行错误解决

问题描述

执行Makefile构建自定义OS时出现以下错误:

init :: non DOS media
Cannot initialize '::' ::kernel.bin: Success
make: *** [Makefile:20: build/main_floppy.img] Error 1

相关代码

Makefile

ASM=nasm
CC=gcc
SRC_DIR=src
TOOLS_DIR=tools
BUILD_DIR=build

.PHONY: all floppy_image kernel bootloader clean always tools_fat

#ALL
all: floppy_image tools_fat


#FLOPPY IMAGE
floppy_image: $(BUILD_DIR)/main_floppy.img

$(BUILD_DIR)/main_floppy.img: bootloader kernel
    dd if=/dev/zero of=$(BUILD_DIR)/main_floppy.img bs=512 count=2880
    mkfs.fat -F12 -n "MOOM_OS" $(BUILD_DIR)/main_floppy.img
    dd if=$(BUILD_DIR)/bootloader.bin of=$(BUILD_DIR)/main_floppy.img conv=notrunc
    mcopy -i $(BUILD_DIR)/main_floppy.img $(BUILD_DIR)/kernel.bin "::kernel.bin"

#BOOTLOADER
bootloader: $(BUILD_DIR)/bootloader.bin

$(BUILD_DIR)/bootloader.bin: always
    $(ASM) $(SRC_DIR)/bootloader/boot.asm -f bin -o $(BUILD_DIR)/bootloader.bin

#KERNEL
kernel: $(BUILD_DIR)/kernel.bin

$(BUILD_DIR)/kernel.bin: always
    $(ASM) $(SRC_DIR)/kernel/main.asm -f bin -o $(BUILD_DIR)/kernel.bin

#TOOLS
tools_fat: $(BUILD_DIR)/tools/fat

$(BUILD_DIR)/tools/fat: always $(TOOLS_DIR)/fat/fat.c
    mkdir -p $(BUILD_DIR)/tools
    $(CC) -g -o2 $(BUILD_DIR)/tools/fat $(TOOLS_DIR)/fat/fat.c

#ALWAYS
always:
    mkdir -p $(BUILD_DIR)

#CLEAN
clean:
    rm -rf $(BUILD_DIR)/*

boot.asm

org 0x7C00
bits 16

%define ENDL 0x0D, 0x0A

jmp strict short start
nop

bdb_oem:                    db "MSWIN4.1"
bdb_bytes_per_sector:       dw 512
bdb_sectors_by_cluster:     db 1
bdb_reserved_sectors:       db 1
bdb_fat_count:              db 2
bdb_dir_entries_count:      dw 0E0H
bdb_total_secotrs:          dw 2880
bdb_media_descriptor_type:  db 0F0H
bdb_sectors_per_fat:        dw 9
bdb_sectors_per_track:      dw 18
bdb_heads:                  dw 2
bdb_hidden_sectors:         dd 0
bdb_large_sector_count:     dd 0

ebr_drive_number:           db 0
                            db 0
ebr_signature:              db 29H
ebr_volume_id:              db 12H, 34H, 56H, 78H
ebr_volume_label:           db "MOOM     OS"
ebr_system_id:              db "FAT12   "

start:
    jmp main

puts:
    push si
    push ax

.loop:
    lodsb
    or al, al
    jz .done

    mov ah, 0x0e
    mov bh, 0
    int 0x10

    jmp .loop

.done:
    pop ax
    pop si
    ret

main:
    xor ax, ax
    mov ds, ax
    mov es, ax
    
    mov ss, ax
    mov sp, 0x7C00

    hlt

.halt:
        jmp .halt


times 510 - ($ - $$) db 0
dw 0xAA55

错误原因

  1. boot.asm参数错误:存在拼写错误bdb_total_secotrs(应为bdb_total_sectors),且卷标ebr_volume_label与Makefile中mkfs.fat指定的MOOM_OS不一致,导致mcopy无法识别镜像为DOS媒体。
  2. FAT参数不匹配:自定义bootloader的FAT引导扇区参数与mkfs.fat生成的参数未完全对齐,破坏了文件系统识别的关键信息。

解决步骤

1. 修正boot.asm的参数错误

  • 修正拼写错误:将bdb_total_secotrs改为bdb_total_sectors
  • 统一卷标:将ebr_volume_label改为db "MOOM_OS "(FAT12卷标要求11字符,不足补空格)

修正后的关键代码段:

bdb_total_sectors:          dw 2880
...
ebr_volume_label:           db "MOOM_OS  "  ; 11字符对齐,与mkfs.fat卷标一致

2. 明确mkfs.fat参数(确保与boot.asm匹配)

修改Makefile中的mkfs.fat命令,显式指定所有与boot.asm对应的参数,避免自动生成的参数不匹配:

mkfs.fat -F12 -n "MOOM_OS" -S 512 -f 2 -R 1 -s 1 -h 2 -r 224 $(BUILD_DIR)/main_floppy.img

各参数对应boot.asm中的字段:

  • -F12:对应ebr_system_id: db "FAT12 "
  • -n "MOOM_OS":对应修正后的ebr_volume_label
  • -S 512:对应bdb_bytes_per_sector: dw 512
  • -f 2:对应bdb_fat_count: db 2
  • -R 1:对应bdb_reserved_sectors: db 1
  • -s 1:对应bdb_sectors_by_cluster: db 1
  • -h 2:对应bdb_heads: dw 2
  • -r 224:对应bdb_dir_entries_count: dw 0E0H(224)

3. 优化mcopy命令(可选)

部分环境下mcopy需要显式指定DOS文件系统兼容性,添加-D o参数:

mcopy -i $(BUILD_DIR)/main_floppy.img -D o $(BUILD_DIR)/kernel.bin "::kernel.bin"

验证

执行make clean清理旧构建文件,再执行make all重新构建,即可正常完成镜像生成与文件复制。

内容的提问来源于stack exchange,提问作者Joshua Alexander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:17:06