ブートローダーはとにかくそのアドレスにロードしますか? なぜこれをプログラムに指定するのですか?
4 に答える
ここでは選択の余地はありません。この記事を読む:
http://en.wikibooks.org/wiki/X86_Assembly/Bootloaders
上記のURLから、BIOS(事実上PCハードウェア)は0000:7c00にメモリにジャンプし、16ビットモードで実行を継続します。
そして上から引用するには:
ブートローダーは、ブートローダーを成功させるためにプログラマーが理解しなければならない特定の条件下で実行されます。以下は、PCBIOSによって開始されたブートローダーに関連しています。
- ドライブの最初のセクターには、ブートローダーが含まれています。
- 1つのセクターは512バイトです。最後の2バイトは0xAA55(つまり、0x55の後に0xAA)である必要があります。そうでない場合、BIOSはドライブを起動不能として扱います。
- すべてが正常であれば、最初のセクターはRAMアドレス0000:7C00に配置され、BIOSの役割は終了して0000:7C00に制御を移します。(つまり、そのアドレスへのJMP)
したがって、起動から、CPUにコードの実行を開始させたい場合は、0000:7c00にメモリに配置する必要があります。また、コードのこの部分は、ハードディスクの最初のセクターからロードされます。これもハードウェアによって行われます。そして、ロードされるのは最初のセクターのみであり、コードの他の部分は、この最初の「ブートローダー」によってロードされる必要があります。
詳細はこちら(ハードディスクの起動セクターと7c00機能について):
http://www.ata-atapi.com/hiwdos.html
http://www.ata-atapi.com/hiwmbr.html
CPUの起動モードと混同しないでください。CPUがフェッチして実行する最初の命令は、物理アドレス0xfffffff0(9-5ページを参照)にあります。
この段階では、不揮発性(つまり、簡単に再プログラムできないため、ブートローダーの責任の一部ではありません)BIOSコードを実行しています。
更新:2015年10月6日
ただし、このBIOSコードにはいくつかのバリエーションがあります(Michael Petchによって強調表示されています)。一部のBIOSは、0000:7c00ではなく07c0:000からロードされ、「grub」ブートローダーソースコードからも抽出されます。
.globl _start; _start:
/*
* _start is loaded at 0x7c00 and is jumped to with CS:IP 0:0x7c00
*/
/*
* Beginning of the sector is compatible with the FAT/HPFS BIOS
* parameter block.
*/
jmp after_BPB
nop /* do I care about this ??? */
after_BPB:
/* general setup */
cli /* we're not safe here! */
boot_drive_check:
jmp 1f
testb $0x80, %dl
jnz 1f
movb $0x80, %dl
1:
/*
* ljmp to the next instruction because some bogus BIOSes
* jump to 07C0:0000 instead of 0000:7C00.
*/
ljmp $0, $ABS(real_start)
ORG疑似命令が行うことは、このオフセットを言及されたすべての絶対アドレスに追加するようにアセンブラに指示することです。たとえば、「MOV AX、my_string」と記述し、my_stringがコードの1234バイトに配置された場合、アセンブラは「MOV AX、7c00h+1234」を生成します。あまり一般的ではありませんが、指定された絶対アドレスから相対アドレス(短いジャンプなど)を計算するために逆に使用されることもあります。
この質問には文脈がありません。しかし、私は何らかの形で答えようとします。
プログラムがメモリにロードされた後に実行されるとき、プログラムはどこかに配置されている必要があります。これがアドレス 7C00 であると想像してください。プロセッサはどこかで実行を開始します。あなたの場合は、おそらく 7C00 です。ORG ステートメントは、次の命令のアドレスがこのアドレスに現れることをアセンブラに伝えています。
なぜ0ではないのですか?まあ、プロセッサはそれらのアドレスで他のものを必要とするかもしれません。割り込みベクトル。
プロセッサのデータシートには、起動シーケンスに関する詳細情報が記載されています。
幸運を。
早速グッデールから・・・
私もそれについて非常に混乱しました。コードとリンク引数に依存しているようです。grub2 の boot.S を見ると、「.org 0」または「.org 0x7c00」がありません。
簡単なブートローダ コードも作成しました。私が使っているのは「.org0」ですが、機能を壊さずに削除できます。私のコードは次のように構築されています:
all:
i686-elf-as -o boot.o boot.S
i686-elf-ld --oformat=binary -Ttext=0x0 -o boot.bin boot.o