借り初めのひみつきち

仮ブログです。

きんきょうてきな?

また更新間隔が空いてしまいました。

フォントのあれ

以前公開すると宣言していた megos フォントについてあえず現場を公開しておきます。
(0610と0608は字形が一緒じゃないかとかまだ気になるところはあるのですが...)

github.com

moe で使用しているフォントの方も submodule で呼び出すように分離しました。
また、思うところあって moe のフォントを変更することにしました。

f:id:neriring16:20190422031956p:plain

ページング、PEローダー、ブートシーケンス

これらは密接な関係があります。

もともと moe は必要になるまでなるべく省略する方向性で作っていたので、ページングは UEFI が設定したものをそのまま使っていました。
その一方で、ページングは正しく構成すればメモリ保護とデバッグ性が向上するので早く独自テーブルに移行したいと考えていました。
ということで、まずは独自のページマネージャを実装しました。

次に、カーネルをページングで保護された領域にロードするためには UEFI に頼らず自力の PE ローダーを実装する必要がありました。
そのため、ブートシーケンスが変更されて EFI/PE ローダーとカーネルが物理的に分離されました。

ここまで実装したらもう UEFI に頼らなくても起動できるよねってことで、少しブートローダーを改良して 32bit UEFI からも起動できるようになりました。
実質 Atom Z3000 番台専用ですが。

ここまでの変更で kernel.efi は見た目が UEFI アプリケーションですが UEFI から直接起動できなくなりました。
UEFI に対応した OS を作るという当初の目的から少し離れた気がします。

Local APIC タイマー

moe は HPET を使っていましたが、HPET をサポートしない環境も存在します。
HPET が使えない環境で次の候補となるタイマーソースは Local APIC タイマーです。
タスクスイッチのタイマーを Local APIC タイマーに変更する対応自体はそんなに難しくなかったですが、 moe は HPET に特化したスケジューラーを持っているので CPU 使用率が正確に反映できませんでした。

色々試した結果、 Local APIC タイマーで HPET の完全な代替は無理と判断しました。

その一方で、 moe のスケジューラーの CPU 使用率測定がもともとオーバースペックだった気もしているので改修を考えています。

ここまでの変更で以前失敗した hyper v から起動ができるようになると期待していたのですが、黒い画面のまま進みませんでした。