为什么我的调试信息没有在内核屏幕上显示?

编程语言 2026-07-09

我现在在写一个内核,我在尝试使用调试信息来检查内核是否出现错误。

但因某种未知原因,我的调试信息没有在屏幕上打印出来,

我尝试了

下面是内核的主要代码:

kernel_entry:
    cli

    mov ax, 0x1000
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    mov si, DEBUG_MSG
    call print_string

    mov ax, 0x1000
    mov ss, ax
    mov sp, 0x9000

    mov si, DEBUG_MSG
    call print_string

    call load_memory_map

    mov si, DEBUG_MSG
    call print_string

    jmp $

print_string:
.next_char:
    mov al, [si]
    cmp al, 0
    je .done

    mov ah, 0x0E
    int 0x10
    inc si
    jmp .next_char
.done:
    ret

DEBUG_MSG db "debug", 13, 10, 0

我没有使用grub,因为我使用自己的汇编引导程序,如果你需要的话:

start:
    push cs
    pop ds

    mov si, boot_title 
    call print_string

    mov si, option_1
    call print_string

    mov si, option_2
    call print_string

    jmp wait_for_input

wait_for_input:
    mov ah, 0x00
    int 0x16

    cmp al, '1'
    je boot_KetOS

    cmp al, '2'
    je reboot

    jmp wait_for_input

boot_KetOS:
    mov si, boot_msg
    call print_string

    jmp load_kernel

load_kernel:
    cli

    mov [BOOT_DRIVE], dl

    mov bx, 0x1000
    mov ax, 0x0000
    mov es, ax

    mov ah, 0x02
    mov al, 16
    mov ch, 0
    mov cl, 2
    mov dh, 0x00

    mov dl, byte [cs:BOOT_DRIVE]

    int 0x13
    jc disk_error

    jmp 0x0000:0x1000


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

(另外我的内核在实模式下的地址是0x0000:0x1000 :3)

解决方案

我的内核在实模式下位于0x0000:0x1000

确实,你的 jmp 0x0000:0x1000 会跳转到那个地址。可是在内核中你把DS初始化为0x1000,指向了内存中更高的位置,导致调试信息无法输出到屏幕。

要么你以以下方式启动内核:

ORG  0x1000
xor  ax, ax
mov  ds, ax

或者你执行以下操作:

ORG  0x0000
mov  ax, 0x0100    ; This is 0x1000 / 16
mov  ds, ax
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章