2016-07-21 28 views
1

これまでの数週間、アセンブリ(x86/x86_64)でブートローダとカーネルを作成してみましたが、もっと複雑な解決策を試していましたが、いくつかのコードを試してみてという名前のユーザーが掲示されましたhereです。私のブートローダのコードは次のとおりです。仮想マシンで起動するブートローダ/カーネル

;set print-registers 
MOV AH, 0x0E ;function nr 
MOV BH, 0x00 ;page 
MOV BL, 0x07 ;color 

MOV SI, msg ;move msg to SI-pointer 
CALL PrintString ;call function to print SI (msg) 

JMP $ ;hang 

PrintString: 
.next_char: 
MOV AL, [SI] ;current character 
OR AL, AL 
JZ .print_done ;if current char is zero, go to end 
INT 0x10 ;print character 
INC SI ;increase pointer to msg (next character) 
JMP .next_char 
.exit_char 
RET 

msg db 'Hello world from the kernel!', 13, 10, 0 

TIMES 512 - ($ - $$) db 0 ;fill the rest 

私はすべてがうまく組み立てるために取得することができ、フロッピーコントローラに接続されたときに、単一のバイナリは、VirtualBox内にブーツを作成しました:

[BITS 16] 
[ORG 0x7C00] 

MOV DL, 0x0 ;drive 0 = floppy 1 
MOV DH, 0x0 ;head (0=base) 
MOV CH, 0x0 ;track/cylinder 
MOV CL, 0x02 ;sector (1=bootloader, apparently sectors starts counting at 1 instead of 0) 
MOV BX, 0x1000 ;place in RAM for kernel - I suppose randomly chosen on examples 
MOV ES, BX ;place BX in pointer ES 
MOV BX, 0x0 ;back to zero - also has something to do with RAM position 

ReadFloppy: 
MOV AH, 0x02 
MOV AL, 0x01 
INT 0x13 
JC ReadFloppy ;if it went wrong, try again 

;pointers to RAM position (0x1000) 
MOV AX, 0x1000 
MOV DS, AX 
MOV ES, AX 
MOV FS, AX 
MOV GS, AX 
MOV SS, AX 

JMP 0x1000:0x0 

;assuming we get never back here again, so no further coding needed (kernel handles everything now) 

TIMES 510 - ($ - $$) db 0 ;fill resting bytes with zero 
DW 0xAA55 ;end of bootloader (2 bytes) 

私のカーネルファイルです。これは私自身のローダーとカーネルで動く自信を与えてくれますが、私はそれをベアメタルで起動することに満足したいと思います。

私は、USBドライブを使用して画像を起動しようとしましたが、私はUSBスティックを正しくイメージしていると確信しています。私はここで本当に明白な何かが欠けていると感じ始めています。私は実際にUSBから生のバイナリを読み取ろうとしている "フロッピー"から13hを読み取ることと関係があると考えています。これは本当ですか?もしそうなら、どのようにフロッピーの代わりに非特定のディスクから読み込むようにブートローダを書き直すことができますか?

+1

リンクをクリックする必要があるため、そこにあるコードは見ていませんが、コードがBIOSパラメータブロックを提供していない場合は、実際のハードウェアを完全に見たことがあります仮想マシンよりはるかに厄介なことがあります。適切にフォーマットされたBPBを持っていることを確認し、それが役立つかどうか確認してください。 –

+0

私はすでにBIOSパラメータブロックを追加しようとしましたが、実際に何も変更されませんでした。 – Lobstre

+1

関連するコードを[MCVE] –

答えて

1

このコードに適用されるGeneral Bootloader tipsを書きました。特に、私は、このヒントがあります:

  1. BIOSは、コードあなたがCS、DS、ES、SS、SPに頼ることができないにジャンプした有効か期待値を登録します。ブートローダーの起動時に適切に設定する必要があります。ブートローダがロードされ、物理アドレス0x00007c00から実行され、ブートドライブ番号がDLレジスタにロードされることのみが保証されます。

最初のフロッピーのブートドライブは、フロッピーディスクイメージを仮想ドライブとしてマウントAに起動するのでので、あなたの仮想マシンは、おそらく働い一般的に0であります:。問題の原因となっているコードは、ReadFloppyコードに記載されています。具体的には、この行:

MOV DL, 0x0 ;drive 0 = floppy 1 

あなたあなたはBIOSによって渡された値を使用する必要があり、ハードコードゼロ。フロッピードライブA以外で起動したシステムでは、失敗する可能性があります。問題を解決するには、単にを削除して上記の行を削除してください。

提供されているリンクに記載されている他のブートローダのヒントを確認することをお勧めします。