0

この小さな単純なカーネルでは、実際に GRUB でブートする必要がないことはわかっていますが、カーネルが大きくなり、ブートする必要がある前に、これを行う方法を学ぼうとしています。OSDev.org のリアル モード アセンブリ チュートリアルを使用して、アセンブリを含む単純なカーネルを作成しました。起動しようとしましたが、GRUB からマルチブート ヘッダーが見つからないというエラーが表示されました。C Bare Bones チュートリアルのアセンブリ コードを調べました。セクション .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
;==================================

前もって感謝します。

4

2 に答える 2

1

リアル モード カーネル (16 ビット) を作成する場合は、GRUB を使用できません。GRUB は 32 ビット カーネルのみをロードできます。

BIOS 割り込みは 32 ビット モードでは単純に使用できないという事実について考える必要があります。

MultiBoot 仕様 ( http://www.uruk.org/orig-grub/boot-proposal.html ) では、GRUB に必要なファイル形式について説明しています。

確かにこれは初心者向けではありません...

GRUB を使用せずにカーネルをブートする場合 (および OS が 510 バイトを超える場合)、ブート セクターは、割り込み 0x13 を使用してディスクから残りの OS をロードする必要があります。

この時点で、コンピューターは 16 ビット リアル モードで実行されます。

于 2014-04-02T11:54:06.167 に答える