私たちは、カーネルの書き方を学び、インとアウトを学ぶプロジェクトに取り組んでいます。ブートストラップローダーが作成されており、機能しているようです。ただし、カーネルの読み込みに問題があります。最初の部分から始めましょう:
bootloader.asm:
[BITS 16]
[ORG 0x0000]
;
; all the stuff in between
;
; the bottom of the bootstrap loader
datasector dw 0x0000
cluster dw 0x0000
ImageName db "KERNEL SYS"
msgLoading db 0x0D, 0x0A, "Loading Kernel Shell", 0x0D, 0x0A, 0x00
msgCRLF db 0x0D, 0x0A, 0x00
msgProgress db ".", 0x00
msgFailure db 0x0D, 0x0A, "ERROR : Press key to reboot", 0x00
TIMES 510-($-$$) DB 0
DW 0xAA55
;*************************************************************************
bootloader.asmは、エディターが動かなくなったり詰まったりすることなく、エディターには長すぎます。さらに、「Welcome to our OS」というメッセージが表示されるので、ブートローダーとカーネルはbochs内で機能します。とにかく、以下はこの時点でカーネルに対して持っているものです。
kernel.asm:
[BITS 16]
[ORG 0x0000]
[SEGMENT .text] ; code segment
mov ax, 0x0100 ; location where kernel is loaded
mov ds, ax
mov es, ax
cli
mov ss, ax ; stack segment
mov sp, 0xFFFF ; stack pointer at 64k limit
sti
mov si, strWelcomeMsg ; load message
call _disp_str
mov ah, 0x00
int 0x16 ; interrupt: await keypress
int 0x19 ; interrupt: reboot
_disp_str:
lodsb ; load next character
or al, al ; test for NUL character
jz .DONE
mov ah, 0x0E ; BIOS teletype
mov bh, 0x00 ; display page 0
mov bl, 0x07 ; text attribute
int 0x10 ; interrupt: invoke BIOS
jmp _disp_str
.DONE:
ret
[SEGMENT .data] ; initialized data segment
strWelcomeMsg db "Welcome to our OS", 0x00
[SEGMENT .bss] ; uninitialized data segment
nasm 2.06rc2を使用して、次のようにコンパイルします。
nasm bootloader.asm -o bootloader.bin -f bin
nasm kernel.asm -o kernel.sys -f bin
bootloader.binを次のようにフロッピーに書き込みます。
dd if=bootloader.bin bs=512 count=1 of/dev/fd0
kernel.sysを次のようにフロッピーに書き込みます。
cp kernel.sys /dev/fd0
私が述べたように、これはbochsで機能します。しかし、フロッピーから起動すると、次のような出力が得られます。
カーネルシェルを読み込んでいます
...........
エラー:キーを押して再起動します
その他の詳細:OpenSUSE 11.2、GNOMEデスクトップ、AMD x64見逃した可能性のあるその他の情報については、お気軽にお問い合わせください。私はここに必要なものすべてを入れようとしました。必要に応じて、bootloader.asm全体をどこかに投稿する方法を見つけることができます。いくつかの理由から、GRUBの使用にはあまり興味がありません。これは変更される可能性がありますが、GRUBを実際に検討する前に、このブートが成功することを確認したいと思います。
編集:ブートストラップローダーは512バイトで、ディスクのブートセクター(最初のセクター)に書き込まれると想定されています。私の言葉を借りれば、ブートローダーは512バイトコンパイルされています。カーネルは次のセクターにあると想定されています。