2016-10-23 6 views
0

私は自分自身を(楽しく教育するための)ちょっとしたブートローダを作成しようとしてきました。これまでのところ、私はMSDOSとまったく同じように動作するブートローダ(あるいはブート可能なプログラム)を完成させました。その後、もっと多くのものを実装しようとしたとき、私は512バイトの制限を超えました。私は小さなOSを拡張することに決めました。 2ステージのブートローダのようにsthを書くようになりました。ステージ2はメインカーネルとして動作し、512バイト以上になります。FAT32ステージ2のブートローダを見つける

私はブートローダの最初の段階を書いています。ほぼ。ステージ2があるセクターにジャンプするというアイデアがありましたが、問題は、誰もがコードやチュートリアルを書いているフロッピーイメージの代わりにFAT32 USBを使用していることです。

私の質問は非常に幼稚です:どのように私はFAT32ファイルシステムでstage1.binを使用してstage2.binを読み込むことができますか?

は、これまでのところ、これは私を助けるために失敗しました: Loading second stage of a bootloader

+0

あなたはFAT32メインディレクトリをスキャンしてメモリにファイルをロードすることができます512バイトシングルブロックのボリュームブートレコードを書くためだけの十分な部屋を持って、両方の手順は、あなたが彼らに従うことを要求しますFATのそれぞれの割当チェーン。これはファイルシステムのメタデータの一部であるため、FAT32 BPB用のスペースを確保する必要がありますが、それでも十分なスペースが残っています –

+0

FATエントリを調べて読み込むことによって、どのセクタが存在するのか把握します。 –

答えて

0

OK、解決策は、(限り、あなたはあなたの第二段階のバイナリが始まる知っているように)かなり簡単であるように思われます。代わりに、(FAT32の第2のブロックである)セクタ0x0200にバイナリをロードしようとするが、他のFATに取り組んだとして、このセクションをロードすると、働いているドライブを分配:

0x7E00:0x00の

FATファイルシステムのタイプその点がどこに影響を与えているようには見えません。 また、私の問題のもう一つは第2段階についてでした。これは、初めに

[ORG 0000]

を持っていたはずです。

決勝コード:

[BITS 16] 
[ORG 0x7C00] 

Boot: 
xor ax, ax ; AX=0 
mov ds, ax ; DS=0 
mov es, ax ; ES=0 


add ax, 0x9000 
mov ss, ax 
mov sp, 0xF000 

mov ah, 0x00 
int 0x13 

mov ax, 0x7E00 
mov es, ax ; Load to 0x7E00 : 0x00 
mov bx, 0x00 
SurucuOku: 
mov ah, 0x02 
mov al, 0x01 ; Read 1 sector 
mov ch, 0x00 ; Read on cylinder 0 
mov cl, 0x02 ; Read sector 2 
mov dh, 0x00 ; Head number 0 
int 0x13 

jnc Basari 
mov al, 0x46 
call hata 
jmp SurucuOku 

hata: 
pusha 
mov ah, 0x09 
mov bh, 0x00 
mov bl, 0x0F 
mov cx, 0x01 
int 0x10 
popa 
ret 

Basari: 
jmp 0x07E00:0x00 

TIMES 510 - ($ - $$) db 0 
DW 0xAA55 
関連する問題