借り初めのひみつきち

仮ブログです。

最小ステップで作る UEFI OS v0.2.1

v0.2 で忘れていたことがあったので補足します。

EFI Runtime Services の構成

ExitBootServices を呼び出した後も EFI Runtime Services を使うためには GetMemoryMap で取得したメモリマップの VirtualStart の値を適切に設定し、一度だけ SetVirtualAddressMap を呼び出す必要があります。
現在作っている OS では当面 Identity Mapped Paging を採用するので VirtualStart = PhysicalStart で設定しますが、本格的にページングを使う場合は他の設定にかえる必要があるかもしれません。

EFI Runtime Services には再起動や電源を切る API 、時計にアクセスする APIEFI 変数にアクセスする API などがあります。
時計は起動時に一度取得したらあとはタイマー割り込みで本体の時計と独立してカウントしていくのが主流ですし、再起動や電源を切る API も最後に1回呼び出すだけですが、実際には多くの機種では UEFI に頼らなくても再起動したり電源を切ることができます。
EFI 変数はコンピュータの起動に関わるものが多く、下手に触ると文鎮になって起動しなくなるものもあるので知らないうちはあまり触らないほうがいいかもしれません。
こうして考えると Runtime Services の API はあまり使う機会が多くありません。

さて、ここまで対応すると「UEFI Aware な OS」と名乗れそうな感じになるわけですが、これ以降は Legacy BIOS だろうが UEFI aware だろうがやることはほとんど変わりません。ただの普通の OS 開発になってしまいます。
OS の開発自体はまだ続けていくつもりですが、「最小ステップで UEFI から OS を起動する」という目的は達成できたのでこの辺で一区切りかなって思ってます。