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

32位自制操作系统内核加载故障排查求助

32位自制操作系统内核加载异常问题

bootloader与保护模式均正常工作,但执行call KERNEL_OFFSET指令时出现加载异常或故障,无法定位原因。相关代码如下:

source/boot.s

bits  16
org   0x7c00

KERNEL_OFFSET equ 0x1000
VIDEO_MEMORY equ 0xb8000

boot:
    mov ah, 0x0
    mov al, 0x3
    int 0x10

    mov [BOOT_DRIVE], dl
    mov bp, 0x9000
    mov sp, bp

    mov bx, KERNEL_OFFSET
    mov dh, 30
    mov dl, [BOOT_DRIVE]

    mov ah, 0x02
    mov al, 0x04
    mov cl, 0x02
    mov ch, 0x00

    int 0x13

    ;Enable A20
    in al, 0x64
    test al, 2
    jnz $
    mov al, 0xD1
    out 0x64, al
    in al, 0x64
    test al, 2
    jnz $
    mov al, 0xDF
    out 0x60, al

    lgdt [GDT_DESCRIPTOR]

    mov  eax, cr0
    or   eax, 0x1
    mov  cr0, eax

    jmp CODE_SEGMENT:protected_mode

GDT_START:
    dq 0x0

GDT_CODE:
    dw 0xFFFF
    dw 0x0
    db 0x0
    db 10011010b
    db 11001111b
    db 0x0

GDT_DATA:
    dw 0xFFFF
    dw 0x0
    db 0x0
    db 10010010b
    db 11001111b
    db 0x0
  
GDT_END:

GDT_DESCRIPTOR:
  dw GDT_END - GDT_START
  dd GDT_START

CODE_SEGMENT equ GDT_CODE - GDT_START
DATA_SEGMENT equ GDT_DATA - GDT_START

bits 32

protected_mode:
    cli
    cld

    mov ax, DATA_SEGMENT
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax

    mov ebp, 0x9FB00
    mov esp, ebp

    mov edx, VIDEO_MEMORY
    mov ebx, MESSAGE
    call print

    ; call KERNEL_OFFSET
    jmp $

print:
    mov al, [ebx]
    mov ah, 0x0F

    cmp al, 0
    jz .done

    mov word [edx], ax
    add edx, 2
    add ebx, 1

    jmp print
    
    .done:
        ret

halt:
    cli
    hlt

BOOT_DRIVE: db 0
MESSAGE: db "Hello, World!", 0

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

source/kernel.c

void kernel_main() {
    char* VGA_MEMORY = (char*) 0xb8000;
    *VGA_MEMORY = 'X';

    while (1);
}

source/linker.ld

ENTRY(kernel_main)

SECTIONS {
    . = 0x1000;

    .text : {
        *(.text)
    }

    .rodata : {
        *(.rodata)
    }

    .data : {
        *(.data)
    }

    .bss : {
        bss_start = .;
        *(.bss)
        bss_end = .;
    }
}

makefile

all:
    mkdir -p build

    nasm -f bin source/boot.s -o build/boot.bin

    gcc -ffreestanding -fno-builtin -fno-pic -m32 -c source/kernel.c -o build/kernel.o

    ld -m elf_i386 -T source/linker.ld -o build/kernel.bin --oformat binary build/kernel.o

    dd if=/dev/zero of=image.bin bs=512 count=2880
    dd if=build/boot.bin of=build/os.bin conv=notrunc
    dd if=build/kernel.bin of=build/os.bin conv=notrunc bs=512 seek=1

    rm build/kernel.o build/kernel.bin build/boot.bin

run:
    qemu-system-x86_64 -drive file=build/os.bin,format=raw,media=disk

启动问题截图

恳请协助解决内核加载问题,谢谢!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:47:08