使用 grub 引导编写的程序集内核



我知道这么小的内核实际上不需要用 GRUB 启动它,但我正在尝试在我的内核变大之前学习如何做到这一点,我需要启动它。我已经在 OSDev.org 使用实模式汇编教程编写了一个简单的带有汇编的内核。 我尝试引导它,但 GRUB 给了我一个错误,它找不到多重引导标头。我看了一下 C 裸骨教程的汇编代码。我只需要将所有内容都放在 .multiboot 部分中吗?你能告诉我我将如何启动这段代码吗?(这段代码不是我创作的,我已经把我的代码留在了家里的机器上,现在在学校,我只是从OSDev借了这段代码,所以请不要给我任何刻薄的评论,说我偷了别人的代码。

; boot.asm
mov ax, 0x07c0
mov ds, ax
mov si, msg
ch_loop:lodsb
or al, al ; zero=end or str
jz hang   ; get out
mov ah, 0x0E
int 0x10
jmp ch_loop
hang:
jmp hang
msg   db 'Welcome to Macintosh', 13, 10, 0
times 510-($-$$) db 0
db 0x55
db 0xAA

我可以使用 BIOS 启动和打印还是使用堆栈?

;====================================
[ORG 0x7c00]      ; add to offsets
xor ax, ax    ; make it zero
mov ds, ax   ; DS=0
mov ss, ax   ; stack starts at 0
mov sp, 0x9c00   ; 200h past code start
mov ax, 0xb800   ; text video memory
mov es, ax
mov si, msg   ; show text string
call sprint
mov ax, 0xb800   ; look at video mem
mov gs, ax
mov bx, 0x0000   ; 'W'=57 attrib=0F
mov ax, [gs:bx]
mov  word [reg16], ax ;look at register
call printreg16
hang:
jmp hang
----------------------
dochar:   call cprint         ; print one character
sprint:   lodsb      ; string char to AL
cmp al, 0
jne dochar   ; else, we're done
add byte [ypos], 1   ;down one row
mov byte [xpos], 0   ;back to left
ret
cprint:   mov ah, 0x0F   ; attrib = white on black
mov cx, ax    ; save char/attribute
movzx ax, byte [ypos]
mov dx, 160   ; 2 bytes (char/attrib)
mul dx      ; for 80 columns
movzx bx, byte [xpos]
shl bx, 1    ; times 2 to skip attrib
mov di, 0        ; start of video memory
add di, ax      ; add y offset
add di, bx      ; add x offset
mov ax, cx        ; restore char/attribute
stosw              ; write char/attribute
add byte [xpos], 1  ; advance to right
ret
;------------------------------------
printreg16:
mov di, outstr16
mov ax, [reg16]
mov si, hexstr
mov cx, 4   ;four places
hexloop:
rol ax, 4   ;leftmost will
mov bx, ax   ; become
and bx, 0x0f   ; rightmost
mov bl, [si + bx];index into hexstr
mov [di], bl
inc di
dec cx
jnz hexloop
mov si, outstr16
call sprint
ret
;------------------------------------
xpos   db 0
ypos   db 0
hexstr   db '0123456789ABCDEF'
outstr16   db '0000', 0  ;register value string
reg16   dw    0  ; pass values to printreg16
msg   db "What are you doing, Dave?", 0
times 510-($-$$) db 0
db 0x55
db 0xAA
;==================================

提前谢谢你。

如果你想写一个实模式内核(16位),那么你不能使用GRUB。GRUB 只能加载 32 位内核。

您应该考虑这样一个事实,即 BIOS 中断不能仅在 32 位模式下使用。

多重引导规范 (http://www.uruk.org/orig-grub/boot-proposal.html) 描述了 GRUB 所需的文件格式。

对于初学者来说,这绝对不算什么...

如果要引导没有

GRUB 的内核(并且操作系统大于 510 字节),引导扇区必须使用中断0x13从磁盘加载操作系统的其余部分。

此时,计算机以 16 位实模式运行。

使用多重引导,您的内核以保护模式启动,在这里。

必须清除"CR0"位 31 (PG)。必须设置位 0 (PE)。其他位 都是未定义的。

Grub 可以启动 16 位内核,因为 Linux 在这里以 16 位启动。但为了方便Linux,FreeBSD,NetBSD和OpenBSD。而这里

不支持多重引导且没有 GRUB 中的特定支持(特定支持适用于 Linux, FreeBSD、NetBSD 和 OpenBSD)必须进行链式加载,这涉及 加载另一个引导加载程序并在实模式下跳转到它

相关内容

  • 没有找到相关文章

最新更新