最後にこの記事書いたの何ヶ月前だったかな?な感じなのでタイトルも変更です。
綺麗なウィンドウシステムがそれなりに動くようになって逆に見た目の進化が乏しくなってしまった myos ですが、今も中身は進化しています。
外部アセンブラの廃止
高級言語で OS を作るにあたり、アセンブラに一切頼らないで作るのはおそらく不可能でしょう。
myos も 99% の処理は rust で作っていますが、一部にアセンブラが必要な処理があります。
myos を作り始めた頃の rust でインラインアセンブラを使うには、汚名高い AT&T 表記と gcc っぽいレジスタ指定が必要で正直使いやすいとは言えなかったので、外部アセンブラで作ったモジュールを build.rs
を使ってビルド時にリンクするというやり方で対応していました。
しかし、この方法は解消したいと思っていました。
やがて rust 側のインラインアセンブラの文法が整理されてだいぶ使いやすくなったので、アセンブラのモジュールを廃止してインラインアセンブラに統一することにしました。
ここで問題となるのが、 SMP 初期化部分です。
x64 の SMP の初期化ではリアルモードからロングモードに遷移するコードを実行するためインラインアセンブラで記述できるかどうかも微妙で対応が難しそうです。 一方、コードとしてはカーネルと独立しているのでインライン化する意味も薄く、外部アセンブラモジュールをリンクする必要もあまりありません。
SMP 初期化部分は頻繁に更新しないしサイズも小さいので、別途外部アセンブラでバイナリファイルを作って include_bytes!
マクロで読み込み実行時に配置して関数ポインタを使って呼び出すように変えました。
フルビルド時には全て更新しますが、通常のビルドではレポジトリにある smpinit.bin
をそのまま使います。
ファイルシステムの UNIX 要素
myos の設計目標のひとつに「UNIX 互換にしない」というのがあります。
汎用 OS は UNIX 系かそれ以外かに大別できるほど UNIX の影響力が強いです。
myos は UNIX 互換ではないので UNIX 系 OS の有名なシステムコールである fork
には対応していません。
その他の UNIX の代表的な要素もほとんどはサポートされていないし、サポートする予定もありません。
しかし、 UNIX のファイルシステムの仕組みはよくできています。 あの MS-DOS でさえ、ファイルシステムは UNIX の影響を強く受けているほどです。 *1
というわけで、裏で動いてる仕組みは UNIX とだいぶ違いますが、 マウントによるファイルシステム拡張とデバイスファイルをサポートしました。
現状デバイスの種類によってインターフェースがバラバラになっていますが、デバイスファイルで整理できるものは整理したいです。
今後の予定
現在の API はとりあえず動けばいいという感じであまり洗練されてない部分も多いです。 ファイルシステムの改修が落ち着いたら API を整理したいです。