4

人生で少なくとも一度は世界中のプログラマーとして、私は自分の「革命的」な新しい唯一のオペレーティング システムを作ろうとしています。:D

さて、私は仮想エミュレーター (Oracle VM Virtual Box) を使用しています。そのために、vmdk ディスクを使用して、新しい unknwon オペレーティング システムを作成します。私は vmdk が好きです。それらは単なるファイルなので、仮想ハードディスクの最初の 512 バイトにブートローダーを貼り付けることができます。

今、この仮想ディスクの次のセクターを読み取ろうとしています。そこに、メッセージを表示する単純なカーネルを貼り付けます。

2 つの質問があります。

  • 2 番目のセグメント (最初の 512 バイトはブートローダによって占められています) を正しく読み取っていますか? コード:

    ReadDisk:
        mov bx, 0x8000  ; segment
        mov es, bx
        mov bx, 0x0000  ; offset
    
        mov ah, 0x02  ; read function
        mov al, 0x01  ; sectors - this might be wrong, trying to read from hd
        mov ch, 0x00  ; cylinder
        mov cl, 0x02  ; sector
        mov dh, 0x00  ; head
        mov dl, 0x80  ; drive - trying to read from hd
        int 0x13   ; disk int
        jc ReadDisk
        jmp [es:bx]   ; buffer
    

    ここで、CF を確認した後、エラー メッセージが表示されます。ただし、INT 13, 1 を使用して最後のステータス メッセージを取得すると、AL は 0 になるため、エラーは保存されません。

  • シンプルなカーネルを vmdk 内の正しい場所に貼り付けていますか? 私がしているのは、ファイルの 512 番目のバイトの後に貼り付けることです。最初の 512 バイトは、私が言ったように、ブートローダーです。ファイルは次のようになります。

    BE 45 7C E8 16 00 EB FE B4 0E B7 00 B3 07 CD 10 <- First sector
    C3 AC 08 C0 74 05 E8 EF FF EB F6 C3 B4 00 B2 80
    CD 13 BE 5D 7C 72 F5 BB 00 80 8E C3 BB 00 00 B4 
    02 B0 06 B5 00 B1 01 B6 00 B2 07 CD 13 BE 4E 7C 
    72 CF 26 FF 27 57 65 6C 63 6F 6D 65 21 00 52 65 
    61 64 69 6E 67 20 65 72 72 6F 72 21 00 52 65 73 
    65 74 74 69 6E 67 20 65 72 72 6F 72 21 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA <- Boot-loader signature
    B4 0E B0 2E CD 10 EB FE 00 00 00 00 00 00 00 00 <- Start of the second sector
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    

これが、カーネルを 2 番目のセクターに追加しようとしている方法です。これの何が悪いと思いますか?ありがとう!

アップデート

OK、エラーは発生しませんが、ロードされたコードが実行されていません。ウィンドウにポイントが表示されます。

;--------------------------------------------
; 'load.asm'
; loaded from 'boot.asm'

[org 0x8000]
[bits 16]

;--------------------------------------------

main:
mov ah, 0x0E  ; print function
mov al, '.'   ; ascii char
int 0x10   ; IO int

jmp $    ; hang
4

2 に答える 2

6

1つの問題はここにあります:

jmp [es:bx]

esこれにより、実際には、レジスタ(セグメント部分)とbx(オフセット部分)に含まれるアドレスのメモリ位置から16ビットオフセットのアドレスが読み取られ、ipその16ビットオフセットに設定されます。

代わりに使用したいものは次のとおりです。

jmp some_constant1:some_constant2

これはとに設定cssome_constant1ipますsome_constant2。当然のことながら、これら2つの定数の適切な候補は、それぞれ0x8000と0です。これは、コードがロードされる場所だからです。

さて、2番目の問題はここにあります:

[org 0x8000]

これによりorg、NASMは、オフセット0x8000でロードされた場合に機能するようにコードを生成するように指示されます。現在、オフセット0x8000はセグメント0x8000と同じものではありません。を使用する場合はjmp 0x8000:0、次も使用する必要があります。

[org 0]
于 2012-06-21T09:56:04.580 に答える
1

失敗してから再試行してください。ディスクが回転しているときにメッセージなしでエラーが表示されると思いますので、初回はエミュレータが意図的に失敗する可能性があります。bochs と qemu の両方で 4 回の試行でうまくいきましたが、それ以外では試していません。以前のエラーをクリアするために、読み取る前にドライブ コントローラをリセットすることもできます。割り込み 0x13 をalクリアで使用し、ドライブ番号を に指定しdlます。


注: ドライブ番号のハードコーディングは、現時点では機能する可能性がありますが、他のドライブからの起動をサポートすることはできません。BIOS はdl、ブートローダを開始するときにドライブ番号を残す必要があるため、それを保存できます。

于 2012-06-17T21:33:41.203 に答える