livaの雑記帳

OSとか作ってみたい

自作OSにおけるUEFI対応戦略

たまにはtwitterのまとめじゃなくて、ちゃんとした記事でも。

自作OS界隈でUEFI流行ってるというか、なんかUEFIすごーい!って崇めてる人が多いようなのでその雑感。

 

UEFIとは

最近主流のブートファームウェアBIOSの高機能版。

最近のUEFIマザーは大体BIOS後方互換性も実装している。

 

BIOSが互換実装されているというのは大きくて、正直今のマザーならBIOSからMBRブートしても何ら問題はない。

でもまあ、新しいデバイスに対応させたいというのはOSを自分で書きたい人の夢だし(たぶん)、何時後方互換が無くなるかも分からないので、UEFI対応するリソースがあるなら、移るべき。

 

UEFIアプリとして作るべき?

UEFIファームウェアは各種デバイス等を扱う関数を提供していて、ネットワークデバイスさえ簡単に扱えるし、プロトコルスタックも実装されているから、もうすぐにパケットでおしゃべりできて凄いらしい。(使った事はない)

なので、UEFIの豊富なハードウェアインターフェースを活用する事で、簡単にOSが自作できると主張する人もいる。確かにそれは1つの戦略としてアリではあるとは思う。

 

自分でOS作りたい人の悩みとして、世の中に星の数程存在するハードウェアを一々サポートしていたらとてもではないけれど間に合わない、というのがある。(昨今のそこそこ大きなハードウェアのデバドラを自力で書くだけの実力がない、という理由もあるだろう)

「OSを実装したい」人には、「アプリケーション向けの抽象化インタフェースを作りたい人」と「ハードウェアを制御したい人」という二種類の人種が存在すると僕は考えている。このうちの前者に相当する人なら、ハードウェアのサポートはあくまでユーザーの利便性のために渋々実装しなければならない類の事なので、デバドラの実装をUEFIファームウェアに投げてしまうという近道を通るのは1つの手だと思う。

ちなみに、僕は後者の「ハードウェアを制御したい人」なので、ちょっとそういうのとは相容れない感じの人間。僕は組み込みシステムとかはあんまり触りたくないのだけど、意外と組み込み屋さんに思考が近いのかなーなんて最近思い始めた。ただし、ハードウェアを制御するのはOSというよりはデバドラなので、厳密には僕みたいな人は「OSを実装してる」人ではないのかもしれない。

あと、そうそう「OSを自作したい人」の中には「ウィンドウを描画したり、GUIかっこよくしたりしたい」という人が一定数いるのだけど、それはOSではなくウィンドウマネージャなので、gnomeとか作れば良いのではないでしょうか。

 

さて、UEFIファームウェアで楽をしたい人はそれはそれで良いと思っているのだけど、UEFIでデバイス触って遊んでても一切独自性はないので、そういう人は早く独自の抽象化インターフェースを作るのに進むのが良いと思います。

「デバイスとかは直接触りたいんだけど、UEFIを通せば簡単だから、UEFI越しに触ればいいや」、ってのは意味不明なので、デバイスを触りたい人はUEFIを崇めてないで、地道にデバドラ書こう。それしかデバイスを触る近道はない。

 

UEFIアプリはあくまでプログラムローダー

UEFIのコンソーシアム的にはUEFIアプリってのはあくまでブートローダーとして使って欲しいらしい、という事を耳にした。最近の殆どのOSは自前でハードウェアを制御するから、ブートローダーとしてのみUEFIを使えれば良い。僕もそれが正しいと思う。

くどいけど、UEFIを使ってOSを作るという方向性自体は否定しない。OSを作ってやりたい事ってのがデバイスを弄る事以外であるならね。

僕みたいなデバイスを直接弄りたい系の人は、さっさとExitBootServices()(だっけ?)を読んで、UEFIを抜ければ良い。結局UEFI経由でデバイスを触るのは楽だけども、デバイスを直接触れてないから、性能を最大限引き出したりする用途では使えない。ExitBootServices()呼び出すまではUEFIがデバイスを握ってるから、OSから制御する事もできないし。(たぶん。触ってないので、もしかしたら間違ってるかも)

 

grub-efiいいよ

UEFIgrubを殺すのだ、という話も聞いた。もしかしたらUEFIコンソーシアム的にはそうなのかもしれない。でも、フルスクラッチでOS作ってる人程grubを使えば良いと思う。

UEFIアプリを使うとめちゃくちゃローダーが簡単に書けるらしくて、たしかにそれは凄い。grubってめちゃくちゃ大規模だけど、それ相当の物が自分で作れてしまうのは革新的だとは思う。でも、結局ローダーである以上、ローダーとカーネルの間の橋渡しインターフェースとかは自分で考えなきゃいけないわけで、その労力はデカい。

OSを作りたい人はOSが作りたいのであって、ローダーとカーネルの間の橋を作りたいわけではない。本当にそういうのを作りたいのであれば、OSではなくてgrubを置き換える素晴らしいブートローダーを書けば良いだけ。

「全て自分で作りたいからOSを作るんだ!」という人もいて、その心意義は凄いし、見習わねばとは思うし、言いたい事も分からないではないのだけど、残念ながら僕のような非凡な人間にはそんな事をやっている暇はない。OSを作るので精一杯。あと、時々「ハードウェアはUEFIがあるから全部使えるようになるんだ、これでついに全部ゼロからOSを作れる!」という人がいるけど、それは流石によくわからん。自分で全部作りたいと言ってる割にUEFIファームウェアにおんぶに抱っこだよそれ、みたいな。

 

というわけで、ファイルシステム設計したり、プロセス構造実装したり、みたいな目的で自作OSやっているのでないなら、grub使うのが近道なのではなかろうか。UEFIアプリで自作ローダーを作るのは自分のOSがそこそこ大きくなってきて、grubだとやりたい事ができない、ってなった時だと思うなぁ。