6

シンプルなOSを開発しようとしています。私は以前にいくつかのアセンブリプログラムを実行INT 10hし、画面に文字を表示するために使用する必要がありました。UEFIがレガシーBIOSをサポートしており、サービスを引き続き使用できる可能性があることを理解していINT 10hます。ただし、純粋なUEFIブータブルOSを構築することを選択した場合、使用を避ける必要がありINT 10hますか?それとも私は物事を間違った方法で見ていますか?

言い換えると、(画面)にドリルダウンprintfstdoutてBIOSを呼び出すことになりますINT 10hか?または、「SYS_WRITE関数呼び出しはINT 10hに基づいていますか?」という質問です。より適切な?

512バイトのブートセクターを作成し、それらをディスク(またはディスクイメージ)の0番目のセクターとして配置する必要がありますか?場所0x7c00はもう意味がありますか?

4

2 に答える 2

7

ブートローダーが UEFI ブートローダーである場合 (そうであるかどうかはわかります)、 int 0x10 を含む BIOS をまったく使用しない可能性があります。BIOS がレガシー ブート システムに提供するすべての機能を提供する UEFI ブートサービスを使用する必要があります。

UEFI ブートローダーを作成していないが、ハードウェアが UEFI 対応の場合、ブートローダーは「レガシー」モードでロードされ、以前と同様に BIOS を使用できます。

別の言い方をすれば、ブート イメージは UEFI ブートローダーまたはレガシー BIOS イメージのいずれかです。レガシー BIOS イメージは UEFI を使用できず、UEFI ブートローダーは BIOS を使用できません。

つまり、ドリルダウンされた printf から stdout (画面) は、BIOS INT 10h を呼び出すことになりますか? それとも、「SYS_WRITE 関数呼び出しは INT 10h に基づいていますか?」という質問ですか? より適切な?

誰が printf 関数を作成したかによって異なります (あなたは OS であり、あなたの下には誰もいません)。Int 0x10 を呼び出し、それを UEFI への呼び出しとして処理して画面に文字を書き込むように IDT を設定していない場合は、未定義の動作を使用しているだけです。

512 バイトのブート セクタを作成し、それらをディスク (またはディスク イメージ) の 0 番目のセクタとして配置する必要がありますか? 場所 0x7c00 はもはや重要ですか?

いいえ、いいえ。UEFI はより大きなブートローダーをサポートし、0x7C00 にはロードされません。特別な意味を持つメモリ領域を知りたい場合は、UEFI にメモリ マップを提供するよう依頼する必要があります。

于 2013-02-27T19:48:29.607 に答える
3

PC BIOS は UEFI プログラミング モデルの一部ではないため、UEFI アプリケーションでは使用しないでください。たとえば、画面に出力するには、UEFI ライブラリの関数を使用します。

ディスクから最初のセクターを読み取り、それを 0x7C00 にロードすることは、BIOS 固有の起動プロトコルです。UEFI ブートローダーはファイルシステムからロードされます。詳細については、OSDev Wikiを参照してください。

于 2013-02-27T09:55:21.457 に答える