私たちが知っているように、ブート署名 (0xAA55) を検索する BIOS 割り込み (INT) 0x19 です。見つかった場合は、0x7C00 でブートローダーをロードして実行します。
私の質問: なぜ 0x7C00 なのですか? 理由は何ですか ?いくつかの方法で評価する方法は?
私たちが知っているように、ブート署名 (0xAA55) を検索する BIOS 割り込み (INT) 0x19 です。見つかった場合は、0x7C00 でブートローダーをロードして実行します。
私の質問: なぜ 0x7C00 なのですか? 理由は何ですか ?いくつかの方法で評価する方法は?
(これは次の質問と重複しているようです
: 起動シーケンスに対する 0000:7c00 のメモリの重要性は何ですか?
BIOS は 512 バイトのブートローダーを 0x7c00 にコピーします)
前者への回答に触発されて、2 つの情報源を引用します。
したがって、最初に David Bradley の返信から 16KB モデルに関する質問に答えてください。
32KB のマシンで起動する必要がありました。DOS 1.0 には最低 32KB が必要だったので、16KB で起動しようとしても問題ありませんでした。
DOS1.0を実行するには最低でも32KB必要なので、16KBモデルは考慮していません。
続いて、「なぜ 32KB-1024B なのか?」に対する回答が続きます。
OS が 32KB 内でロードできるように、できるだけ多くの余地を残したいと考えました。808x Intel アーキテクチャは、ソフトウェア割り込み用にメモリ範囲の最初の部分を使い果たし、BIOS データ領域はその後にありました。そのため、ブートストラップ ロードを 0x7C00 (32KB ~ 1KB) に配置して、その間に OS をロードするためのすべての余地を残しました。ブート セクタは 512 バイトで、実行時にはデータとスタック用のスペースが必要になるため、残りの 512 バイトです。したがって、INT 19H の実行後のメモリ マップは次のようになります。
いいえ、そのケースは考慮外でした。IBM PC 5150 ROM BIOS 開発者チーム メンバーの 1 人である David Bradley 博士は、次のように述べています。
「DOS 1.0 には最低 32KB が必要だったので、16KB での起動を試みることについては心配していませんでした。」
(注: DOS 1.0 は最小で 16KiB が必要でしたか? または 32KiB でしたか? どちらが正しいかはわかりませんでした。しかし、少なくとも、1981 年の初期の BIOS 開発では、32KiB が DOS の最小要件であると想定されていました。)
BIOS 開発者チームは、次の理由で 0x7C00 を決定しました。
- 彼らは、OS が 32KiB 内でロードできるように、できるだけ多くの余地を残したいと考えていました。
- 8086/8088 は割り込みベクトルに 0x0 ~ 0x3FF を使用し、BIOS データ領域はその後にありました。
- ブート セクタは 512 バイトで、ブート プログラム用のスタック/データ領域にはさらに 512 バイトが必要でした。
- したがって、32KiB の最後の 1024B である 0x7C00 が選択されました。
OS がロードされて起動すると、電源がリセットされるまでブート セクタは使用されません。そのため、OS とアプリケーションは 32KiB の最後の 1024B を自由に使用できます。
この回答が、なぜ/どのように起こったのかを確認するのに十分な根拠に基づいていることを願っています.
これはおそらく死んでいますが、私は答えるつもりです。
ブートローダーの開始時に、セグメントの起点を に設定すると0x7c00
、レジスタもそのアドレスにジャンプします。そのため、理想的には、int0x19
コマンドの使用方法を説明しているオンライン リソースを確認すると、別のアドレスにジャンプする方法が案内されます。
これを修正するには、理想的には、新しいアドレスへの各ジャンプの開始時にスタックを 0 にリセットします。