5

私たちは、カーネルの書き方を学び、インとアウトを学ぶプロジェクトに取り組んでいます。ブートストラップローダーが作成されており、機能しているようです。ただし、カーネルの読み込みに問題があります。最初の部分から始めましょう:

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バイトコンパイルされています。カーネルは次のセクターにあると想定されています。

4

1 に答える 1

3

kernel.sys2番目のセクターから開始する場合は、の代わりにこれを使用してcpください。

dd if=kernel.sys of=/dev/fd0 bs=512 seek=1

または、が正確に512バイトであると仮定bootloader.binすると、これも機能します。

cat bootloader.bin kernel.sys > /dev/fd0
于 2010-03-28T17:12:55.940 に答える