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

第二阶段Bootloader进入后陷入启动循环问题求助

问题:第二阶段Bootloader进入保护模式后持续启动循环

我正在编写一个无需文件系统、可将内核加载至保护模式的第二阶段Bootloader,代码采用汇编编写、NASM编译,但进入第二阶段后设备持续陷入启动循环。

曾尝试修改第一阶段中加载内核的扇区编号,但这会导致int 0x13读取失败,进而破坏跳转到第二阶段的流程。错误似乎出在第二阶段的or al, 1指令处,但禁用该指令会无法进入保护模式。将第一、第二阶段合并到单个汇编文件时,内核加载完全正常,推测问题可能与编译方式有关。想确认是否只是加载内核的扇区存在问题?

(备注:从事Osdev仅数月,首次发帖,若有不当之处敬请告知。)

Stg1.asm

; 上下文说明:Boot_Disk为0,Kernel_Location为0x2000
[ORG 0x7C00]
mov [BOOT_DISK], dl

xor ax, ax                          
mov es, ax
mov ds, ax
mov bp, 0x8000
mov sp, bp

mov bx, KERNEL_LOCATION
mov dh, 2 ; 要读取的扇区数

mov ah, 0x02
mov al, dh 
mov ch, 0x00 ; 柱面
mov dh, 0x00 ; 磁头
mov cl, 0x02 ; 扇区
mov dl, [BOOT_DISK]
int 0x13

jmp 0x0000 ; 跳转到第二阶段

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

Stg2.asm

; 再次说明:Kernel_Location为0x2000
[ORG 0x0]
cli
lgdt [gdt_descriptor]
mov eax, cr0
or al, 1
mov cr0, eax
jmp CODE_SEG:start_protected_mode


gdt_start:
gdt_null:
    dd 0x0
    dd 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 - 1
    dd gdt_start

CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start


[bits 32]
start_protected_mode:
    mov ax, DATA_SEG
    mov ds, ax
    mov ss, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    
    mov ebp, 0x90000    ; 32位栈基址
    mov esp, ebp

    jmp KERNEL_LOCATION

TIMES 2048-($-$$) db 0

run.sh

cat "boot1.bin" "boot2.bin" "full_kernel.bin" "zeros.bin"  > "OS.bin"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:07:33