1

私は2ステージのブートローダーを書いています。最初のステージは2番目のステージをロードし、gdtをセットアップして、プロテクトモードとすべてをオンにします。私はいくつかのマニュアルと以前の質問に目を通しましたが、それでもこの問題に直面しています。BIOS int 0x13呼び出しでセクターをロードすると、すべてゼロになり、理由を見つけることができません。これがセクターを読み取るための私のコードです。最初のセクターも読み取ろうとしましたが、それでもメモリ内のすべてがゼロになりました。

    read:
    xorw    %ax,%ax
    movw    %ax,%es
    movw    $0x1000,%bx
    movb    $0x2, %ah   #command to read the sector
    movb    $0x80, %dl  #read from the hard disk
    movb    $0x1, %al  # read one sector
    movb    $0x1, %ch  #track no
    movb    $0x1, %cl  # read the first sector
    movb    $0x1 , %dh  # head number
    int     $0x13    
    jc      read
    movw    $0x11fe, %di
    movw    (%di),%ax
    cmpw     $0xaa55,%ax  # testing the signature
    jne     error
    ljmp    $0x0,$0x1000

ご覧のとおり、最初のセクターを再度読み取ろうとしていますが(テストのため)、メモリにはすべてゼロが含まれています。次を使用して作成した仮想ディスクイメージを使用しています。

    dd if=/dev/zero of=obj/kern/kernel.img~ bs=512 count=20000 2>/dev/null
dd if=obj/boot/boot of=obj/kern/kernel.img~ conv=notrunc 2>/dev/null
dd if=obj/boot1/boot of=obj/kern/kernel.img~ seek=1 conv=notrunc 2>/dev/null
dd if=obj/kern/kernel of=obj/kern/kernel.img~ seek=3 conv=notrunc 2>/dev/null
mv obj/kern/kernel.img~ obj/kern/kernel.img

あなたの提案を手伝ってください。

4

1 に答える 1

0

簡単な答えは、最初のセクターはセクター 1、トラック 0、ヘッド 0 です。

幸いなことに、ブートローダーを作成するのは簡単ですが、それを機能させることが最も満足のいくものです。

于 2012-07-22T15:54:49.310 に答える