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

OS开发:汇编引导扇区调用外部C函数的BIN格式适配问题咨询

解决引导扇区调用C内核的问题

一、完成内核的编译与链接

单独编译C内核无法直接被引导扇区调用,需要将编译出的.o文件转换成纯二进制格式,并指定内存布局:

  1. 编写链接脚本(比如命名为kernel.ld),定义内核的加载地址(通常选1MB处的0x100000作为保护模式内核起始地址):
    ENTRY(kernel_main)
    SECTIONS {
        . = 0x100000;
        .text : { *(.text) }
        .data : { *(.data) }
        .bss : { *(.bss) }
    }
    
  2. 执行编译链接命令,生成纯二进制内核文件:
    gcc -ffreestanding -m32 -c kernel.c -o kernel.o
    ld -m elf_i386 -T kernel.ld kernel.o -o kernel.elf
    objcopy -O binary kernel.elf kernel.bin
    

二、修复int 13h磁盘加载逻辑

int 13h加载失败多因参数错误或未做错误检查,以下是修正后的实模式加载代码示例:

; 将内核加载到实模式临时地址0x10000
mov ax, 0x1000
mov es, ax
xor bx, bx          ; ES:BX = 0x1000:0x0000 = 0x10000

mov ah, 0x02        ; int 13h读扇区功能号
mov al, 0x10        ; 读取16个扇区(根据实际内核大小调整)
mov ch, 0x00        ; 磁道号0
mov cl, 0x02        ; 起始扇区2(引导扇区占第1扇区)
mov dh, 0x00        ; 磁头号0
mov dl, 0x80        ; 目标硬盘(虚拟机镜像用0x00代表软盘)
int 0x13

jc disk_error       ; 若CF标志置位,说明读取失败,跳转到错误处理逻辑

三、保护模式下跳转到内核

进入保护模式前需配置好GDT(全局描述符表),将代码段基址设为0、限长设为0xFFFFF,确保线性地址与逻辑地址一致,之后直接跳转到内核入口地址:

; 假设已完成GDT加载、CR0寄存器PE位置位
jmp CODE_SEG:0x100000  ; CODE_SEG为GDT中代码段的选择子

四、合并生成可启动镜像

将引导扇区与内核二进制文件合并,生成虚拟机可直接加载的镜像:

cat boot.bin kernel.bin > os.img

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:11:15