2017-01-28 9 views
1

私はアセンブリでブートローダを作成していますが、それは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 
+0

相対ジャンプが使用されている場合、ジャンプが近づくことがあります。 – MikeCAT

+0

申し訳ありませんが、私たちはその小さな情報であなたを本当に助けることはできません。手元にある問題を実証し、これを私たちに示すだけの十分なコードで、おそらく2番目のブートローダを作ることができますか? – fuz

+0

小さな部分に分割して解決してください。セクタ2の読み込み前に文字を印刷する場合、この読み込み後に別の文字を印刷します(読み取り呼び出しがエラーを返したかどうかは異なります)。利用可能なオープンソースのブートローダとあなたのコードを比較してください。多分彼らはあなたが逃したいくつかのセットアップを行います。あなたはコールの前に適切なセットアップをするためにRalf Brown Interrupt Listに従ったことがありますか? – Netch

答えて

1

ハードウェアがUSBドライブのためのフロッピーディスクエミュレーションを使用している場合は、それが可能であることなしあなたのMBRに適切なBIOS Parameter Block (BPB)が正しく起動していません。多くのBIOSはブートローダーの開始時にBPBを検出しようとしますが、ブートローダーがメモリにロードされた後に適切なドライブジオメトリで値を更新することさえあります。ブートローダーが適切なブート可能なドライブとして検出されていないか、BIOSがドライブジオメトリ情報を含むコードの一部を上書きして実行している可能性があります。

次に、2.88MBフロッピーのように見えるBPBを追加します。

.global _start 
.code16 
.text 

_start: 
    jmp  main 
    .space 3 - (.-_start) 

    /* Configuration for a 2.88MB floppy using FAT 12 */ 
    OEMname:   .ascii  "MYBOOT " 
    bytesPerSector:  .word  512 
    sectPerCluster:  .byte  1 
    reservedSectors: .word  1 
    numFAT:    .byte  2 
    numRootDirEntries: .word  240 
    numSectors:   .word  5760 
    mediaType:   .byte  0xf0 
    numFATsectors:  .word  9 
    sectorsPerTrack: .word  36 
    numHeads:   .word  2 
    numHiddenSectors: .long  0 
    numSectorsHuge:  .long  0 
    driveNum:   .byte  0 
    reserved:   .byte  0x00 
    signature:   .byte  0x29 
    volumeID:   .long  0x54428E71 
    volumeLabel:  .ascii  "NO NAME " 
    fileSysType:  .ascii  "FAT12 " 

main: 
    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 

.space 510-(.-_start) 
.word 0xaa55 
+1

のようなセグメントオーバーライドでメモリアクセスを行います。 – user2725580

関連する問題