私はアセンブリでブートローダを作成していますが、それはqemu、bochs、およびvirtualboxで正常に動作するようです。しかし、カーネルを実際のハードウェアにロードしているわけではありません。ブートローダはエミュレータでは動作しますが、実際のハードウェアでは動作しません
ブートローダは、(デバッグ用の)ビデオメモリに文字を書き込むことから始まり、ドライブからセクタ2を読み込み、カーネルに遠くまでジャンプします。カーネルはビデオメモリにいくつかの文字を書き込んでいます。
実際のマシンでは、ブートローダーの文字が画面に表示され、そこにハング(点滅するキャレット)があります。
DS、ES、SIをゼロに設定しようとしましたが、スタックセグメントも設定しています。
私はドライブのセクタ2をbios int 13関数2で読み込んでいます。ドライブ番号と何か関係があります。私は起動時に(dlで)ブートローダに渡されたドライブ番号を使用しようとしましたが、手動で0x0、0x80および0x81に設定しました。
私が気づいた奇妙なことの1つは、私がジャンプの近くで使用するラベルが、魔法のように正しいアドレスを取得していることです。 objdumpを使って私は例を見てください:jmp 0x2、gdbとqemuを使って、それは言う:jmp 0x7c02。 CSおよび他のすべてのセグメントレジスタはゼロです。リンクに-Text 0x0または-Text 0x7c00を使用するかどうかによって、ブートローダはすべてのエミュレータで正常に動作します。 objdumpは-Text 0x7c00とリンクするとjmp 0x7c02と表示します。
EDITは、ブートローダは次のようになります。
.code16
.text
movw $0xb800, %ax
movw %ax, %ds
movw $0x0741, (0x0)
xorw %ax, %ax
movw %ax, %ds
movw %ax, %si
movw %ax, %es
movw $0x8000, %ax
movw %ax, %ss
movw $0, %sp
movb $2, %ah
movb $1, %al
movw $0x02, %cx
movb $0x00, %dh
movw $0x5000, %bx
movw %bx, %es
movw $0x0, %bx
int $0x13
ljmpw $0x5000, $0x0000
編集を、第二段階:
.code16
.text
movw $0xb800, %ax
movw %ax, %ds
movw $0x0742, (0x2)
forever:
jmp forever
相対ジャンプが使用されている場合、ジャンプが近づくことがあります。 – MikeCAT
申し訳ありませんが、私たちはその小さな情報であなたを本当に助けることはできません。手元にある問題を実証し、これを私たちに示すだけの十分なコードで、おそらく2番目のブートローダを作ることができますか? – fuz
小さな部分に分割して解決してください。セクタ2の読み込み前に文字を印刷する場合、この読み込み後に別の文字を印刷します(読み取り呼び出しがエラーを返したかどうかは異なります)。利用可能なオープンソースのブートローダとあなたのコードを比較してください。多分彼らはあなたが逃したいくつかのセットアップを行います。あなたはコールの前に適切なセットアップをするためにRalf Brown Interrupt Listに従ったことがありますか? – Netch