为什么我的调试信息没有在内核屏幕上显示?
我现在在写一个内核,我在尝试使用调试信息来检查内核是否出现错误。
但因某种未知原因,我的调试信息没有在屏幕上打印出来,
我尝试了
下面是内核的主要代码:
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。