最近の大きな変更点は、カーネルとブートローダーを分離しました!
UEFI の便利なところはカーネルを直接起動できるところです。 一方、カーネルに UEFI のコードが含まれることによる問題も少なからずあるので、 ブートローダーを分離することになりました。
これにより以下のような拡張の余地が生まれます(対応するとは言ってない( ー`дー´)キリッ
- UEFI 以外のファームウェアからの起動
- ビット数が異なる(32bit) UEFI からの起動
- 自由なページング、自由なカーネルの配置、ASLR
- バイナリ形式の変更(ELFなど) 、圧縮など
- ローダーとカーネルで独立したメモリアロケーター
移行手順としては、まず以前 C で作ったブートローダーから起動できるようにカーネルの起動部分を調整、その後 Rust でほぼ同等機能のブートローダーを書き直し、両者の IF を調整しながらカーネルから UEFI 依存コードを排除という手順で移行しました。
qemu で動くようになっていざ実機で試したら NX bit のせいで起動しませんでした。 UEFI は NXE が有効になってないケースがあるようです。 でも、独自のブートローダーならカーネルの起動前にページングを操作できるのでカーネルのページ属性も自由に操作できます。
やろうと思えばここからメニューを出したりさらに高機能なブートローダーにすることもできないことはないのですが、高機能ブートローダーはいずれ別に作ることとし、カーネルを配置するだけのブートローダーはあまり前面に出てこない方がいいと思ってますヽ(•̀ω•́ )ゝ✧