借り初めのひみつきち

仮ブログです。

Rust 自作 OS 日記/Part 3 ブートローダー

最近の大きな変更点は、カーネルブートローダーを分離しました!

f:id:neriring16:20200815140338p:plain

UEFI の便利なところはカーネルを直接起動できるところです。 一方、カーネルUEFI のコードが含まれることによる問題も少なからずあるので、 ブートローダーを分離することになりました。

これにより以下のような拡張の余地が生まれます(対応するとは言ってない( ー`дー´)キリッ

  • UEFI 以外のファームウェアからの起動
  • ビット数が異なる(32bit) UEFI からの起動
  • 自由なページング、自由なカーネルの配置、ASLR
  • バイナリ形式の変更(ELFなど) 、圧縮など
  • ローダーとカーネルで独立したメモリアロケーター

移行手順としては、まず以前 C で作ったブートローダーから起動できるようにカーネルの起動部分を調整、その後 Rust でほぼ同等機能のブートローダーを書き直し、両者の IF を調整しながらカーネルから UEFI 依存コードを排除という手順で移行しました。

qemu で動くようになっていざ実機で試したら NX bit のせいで起動しませんでした。 UEFI は NXE が有効になってないケースがあるようです。 でも、独自のブートローダーならカーネルの起動前にページングを操作できるのでカーネルのページ属性も自由に操作できます。

やろうと思えばここからメニューを出したりさらに高機能なブートローダーにすることもできないことはないのですが、高機能ブートローダーはいずれ別に作ることとし、カーネルを配置するだけのブートローダーはあまり前面に出てこない方がいいと思ってますヽ(•̀ω•́ )ゝ✧