编译自定义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
错误原因
- boot.asm参数错误:存在拼写错误
bdb_total_secotrs(应为bdb_total_sectors),且卷标ebr_volume_label与Makefile中mkfs.fat指定的MOOM_OS不一致,导致mcopy无法识别镜像为DOS媒体。 - 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
相关产品推荐
相关产品推荐

