第二阶段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
相关产品推荐
相关产品推荐

