MikanOSの歴史
この記事は 自作 OS アドベントカレンダー 2019 の 2 日目の記事です。
MikanOS
筆者(uchan_nos)はここ数年,教育用 OS である MikanOS(ミカノス)を作っています。 MikanOS は「未完」と「蜜柑」を掛けた名前です。
MikanOS は教育用 OS と言っている通り,将来は大学などの授業で採用されたらいいなあと思って作っています。 今のところ 2020 年 12 月から 2021 年 1 月に東工大で開催する予定の自作 OS 講義のサンプルとして採用を予定しています。 (この講義については 筆者の宣伝ツイート を参照してください)
この記事は MikanOS 製作の進捗を過去から現在までまとめてみるものです。
USB ドライバに苦しむ 1 年半
xHCIのリングバッファの実装方法おもろいな。書き込みポインタが一周するたびに「周回ビット」を反転させて、その周回ビットをリングバッファの各要素に書き込んでおくらしい。読み込み側も周回ビットを独自に持っていて、周回ビットと要素のビットが等しいなら有効なデータだとして処理。
— 社会人でもOSを作りたい (@uchan_nos) 2017年8月6日
2017 年 8 月初旬に xHCI ホストコントローラドライバを作り始めたらしい形跡が。この時,まさか 1 年半も xHCI に手を焼くことになろうとは思っていないのでありました。
xHCIの制御を規格書だけを頼りにやるのは厳しさがある。xHCIドライバ作成の本(未来の自分が書く)がとても欲しい。
— 社会人でもOSを作りたい (@uchan_nos) 2017年10月26日
USB 3.0 ホストドライバ自作入門 の出版を示唆しているのでしょうか。
xHCIの話。あるTransfer ringにNo-Op TRBを送信してもイベントが返ってこない… Transfer ringに送信できないようなTRBを送信するとTRB Errorが返ってくるので、Transfer ringがxHCIに認識されてないことはなさそう。
— 社会人でもOSを作りたい (@uchan_nos) 2018年1月11日
2018 年に入ると,Command Ring はひとまず終わって Transfer Ring のプログラミングに突入したようです。 Command Ring は xHCI 自体とやり取りする仕組みで,Transfer Ring は各 USB デバイスとのやり取りを担当します。
僕のMinnowBoard Turbotに載ってるxHCIホストコントローラがバグっている.
— 社会人でもOSを作りたい (@uchan_nos) 2018年12月11日
機械に文句を言うようになりいよいよ頭がおかしくなってきました。 もう嫌になって半年ぐらい MikanOS から距離を置きます。
やった!このバグが取れた!バグが取れてからxHCIの仕様書を読んだらばっちりそのことが書いてあったよ…
— 社会人でもOSを作りたい (@uchan_nos) 2019年6月25日
久々に xHCI ドライバ開発を再開するのが 2019 年 6 月。 USB 機器は 1 つずつ初期化しないとうまくいかないことをこの時点で知ります。
x,yの移動量が12ビットずつ、3バイトで送られてくることは突き止めた。取り敢えず実機でキーボードとマウスが同時に動くようになりました。 pic.twitter.com/RpKMPLuatV
— 社会人でもOSを作りたい (@uchan_nos) 2019年6月26日
まもなく実機で USB キーボードやマウスが動くようになったようです。
MikanOS 大航海時代
xHCI ドライバが片付くと目に見える進捗が生まれやすくなります。2019 年 7 月からは怒涛の進捗発表モード。
レイヤーの概念を実装して,マウスカーソルが重なっても背景が壊れないようになりました pic.twitter.com/vDf5EgTiIh
— 社会人でもOSを作りたい (@uchan_nos) 2019年7月23日
再描画を高速化したらコンソールのスクロールの遅さも目立ったので,そちらも高速化した。画像では分からないと思うけど,バッテリ駆動(CPUパワー20%)で実験してもつっかかりが分からない程度に高速化した。[]内がコンソールに1行表示するのにかかった時間。スクロールが発生しだすと遅くなる。 pic.twitter.com/oIQ4oUuWSy
— 社会人でもOSを作りたい (@uchan_nos) 2019年8月4日
本格的なアフターヌーンティーに来てみた pic.twitter.com/wbxsx2DA8N
— 社会人でもOSを作りたい (@uchan_nos) 2019年8月4日
関係ないですが紅茶が好きなのでアフタヌーンティーに行ってきました。 この店は目黒にあります。めっちゃいい店でした。また行きたい。
自作OSでマウスカーソルが画面の外に飛び出ないようになりました。(後ろにズラッと並んでいる数字はマウスの移動とコンソールのスクロールにかかった時間) pic.twitter.com/66Uw5GF9m1
— 社会人でもOSを作りたい (@uchan_nos) 2019年8月19日
8 月下旬になっても進捗発表が継続します。
高速カウンタを実装してみました。動きがあるといいね。 pic.twitter.com/kjvcJsiaxd
— 社会人でもOSを作りたい (@uchan_nos) 2019年8月22日
自作OSでウィンドウのドラッグができるようになりました!(亜流・私立・プログラミングキャンプday1の成果) #sub_upcamp pic.twitter.com/ZX4aZwItg1
— 社会人でもOSを作りたい (@uchan_nos) 2019年8月24日
サイボウズ・ラボユース合宿の成果。Local APICからのタイマー割り込みを受け取れるようになりました。 pic.twitter.com/5U9Jm8Gaj0
— 社会人でもOSを作りたい (@uchan_nos) 2019年8月27日
タイマーの使い方は Local APICタイマー入門 を参照するといいと思います。 動画付きで進捗発表すると分かりやすくていいですね。
自作OSがLIFEBOOK WU2/C3実機でも動作しました。やったね。 pic.twitter.com/vu9fePDnog
— 社会人でもOSを作りたい (@uchan_nos) 2019年8月28日
LIFEBOOK や GPD Micro PC,AMD FX-8800P を積んだ A10N-8800E というマザーボードなどで動作が確認されていきます。
上記ツイートはAMD FX-8800Pを積んだA10N-8800Eというマザボでの試験。GPD MicroPCでも動かしてみたのがこの動画。普通に動いた。Local APICタイマーのクロック周波数は19.2MHzらしい。 pic.twitter.com/baTXGNqCmM
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月1日
自作OSがUSBキーボードに対応しました。Shiftキーを使っての大文字や記号の入力にも対応。マウスと同じHIDデバイスなので比較的すぐに対応できました。 pic.twitter.com/iNvxR85ZaD
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月2日
訳あって USB キーボードを意図的に無効にしていたのをここで有効化します。 文字入力できるようになると一気に OS っぽくなりますね。
点滅するカーソルの機能を付けました。カーソルが付くとテキストボックス感が一気に増しますね。 pic.twitter.com/9aF330j2mQ
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月4日
マルチタスク時代
プリエンプティブ・マルチタスクに改造してみました。0.02秒毎にタスクAとBが切り替わります。タスクAが暇なときにタスクBに時間を譲る実装をしていないため,協調的マルチタスクのときよりタスクBのカウンタの進みが遅いことが分かりますね。 pic.twitter.com/G78Fy7Behb
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月8日
自作OSが普通にMacBook Air Mid 2017でも起動しました。内蔵キーボードとマウスは使えませんが。 pic.twitter.com/9o3WxkcKoy
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月10日
MacBook Air でも MikanOS が動作しました。(動作できたよっていうだけのツイートなのにめっちゃ反応もらったのは Apple の強さか…)
自作OSでタスクのスリープとウェイクアップを実装しました。動画はSキーとWキーでTaskBを眠らせたり起こしたりする様子です。 pic.twitter.com/aVBbTLgoqX
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月11日
自作OS進捗。メインタスクでメッセージキューが空になったらスリープし,メッセージがpushされたら起きるという機能を実装しました。メインタスクが0.5秒ごとのタイムアウトメッセージ,およびマウス移動メッセージにより起こされているのが分かります。 pic.twitter.com/g9buyRQTUc
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月13日
自作OSにレベル別ランキューを搭載しました。マウスイベントを受け取るメインタスクのレベルを3→2→1→3…と変化させて実験。他のタスクはレベル1のまま。メインタスクがレベル1になったときだけ他のタスクも動作できているのが分かりますね。 pic.twitter.com/meSpQwm84F
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月15日
自作OSのTaskBウィンドウをドラッグするとゴミが出ることに気づきました。TaskBとメインタスクで画面描画が競合しているためです。直そう。 pic.twitter.com/rxZS3kzAwW
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月17日
自作OSにウィンドウのアクティブ,非アクティブの切り替えと,アクティブにしたときに最前面に来る機能を付けました。とはいえまだ表示だけで,キーボード入力は固定のウィンドウに向けて送信されちゃうのですが。 pic.twitter.com/EVGZs6umvx
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月18日
アクティブウィンドウに応じてキー入力を切り替える処理を追加しました。テキストボックスがあるウィンドウがアクティブなときのみ,テキストボックスに文字列が入力されます。キー入力がどのウィンドウにも受け付けられなかったときはログに出ます。 pic.twitter.com/SeaMllPaCa
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月20日
ウィンドウのアクティブ・非アクティブが切り替わるのカッコいいと思いませんか?
肉寿司 pic.twitter.com/OLQ0y6q7j6
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月20日
筆者は馬刺しが大好きです。
自作OSに待望のechoコマンドを実装しました。 pic.twitter.com/3RBVIyyIFU
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月25日
自作OSにlspciコマンドを追加したので好きなときにPCIデバイスの一覧を眺めることができるようになりました。自作OSをUSBメモリに入れておけばいろんなパソコンでPCIデバイスを一覧できます。ちなみに,クラスコード0c.03.30がxHCIコントローラのことですね。 pic.twitter.com/x4NFqJqUt2
— 社会人でもOSを作りたい (@uchan_nos) 2019年9月28日
自作OSのターミナルにコマンド履歴機能を実装しました。矢印キーの上下で履歴をたどることができます。呼び出した履歴は編集してから実行できます。 pic.twitter.com/Svpnm3sNfm
— 社会人でもOSを作りたい (@uchan_nos) 2019年10月1日
デバッグに地味に役立つ履歴機能(575)
ファイル一覧の表示がとりあえずできるようになりました。まだコマンドにはしていませんけど。 pic.twitter.com/IAJUFq77sk
— 社会人でもOSを作りたい (@uchan_nos) 2019年10月12日
自作OSにlsコマンドを実装しました。FAT32のルートディレクトリにあるファイル一覧を表示します。(処理をサボっていてボリュームラベル"MIKAN OS"も表示されてしまっていますね) pic.twitter.com/KWyq4FIED3
— 社会人でもOSを作りたい (@uchan_nos) 2019年10月13日
FAT32 ファイルシステムを解釈してファイルリストが出せるようになったので ls コマンドを付けました。 いやあ,ファイルリストが出たらなんか感動しちゃいました。
自作OSにcatコマンドを実装しました。このcatコマンドはFATファイルシステムのクラスタチェーンをきちんと解釈し,複数クラスタにまたがるファイルの読み込みができます。スクリーンショットは,UEFIで取得したメモリマップを記録したテキストファイルをcatコマンドで表示している様子です。 pic.twitter.com/I1hQMORg9M
— 社会人でもOSを作りたい (@uchan_nos) 2019年10月15日
自作OSで個別ファイルとして作成したアプリが起動できるようになりました。写真は逆ポーランド記法電卓アプリを実行しているところです。(まだページング,またはリロケーション機能はありませんので,それらが必要になるアプリは実行できません。) pic.twitter.com/tYuj3RVM0T
— 社会人でもOSを作りたい (@uchan_nos) 2019年10月27日
自作OSでページングを設定し,アプリが0xffff800000000000という64ビットアドレス空間の後半の領域で動作するようになりました(OSは前半領域に置いてます)。試しに3MB程度のメモリを使うアプリ(large)を起動させようとすると,4Kページをたくさん設定するので時間がかかりますね。 pic.twitter.com/igYq9jfJAb
— 社会人でもOSを作りたい (@uchan_nos) 2019年11月8日
ここが今現在の最新状態です。この後 2019 年 11 月 23 日にオープンソースカンファレンス 2019 東京・秋に出展しました。
osdev-jpブースはこんな感じです pic.twitter.com/96DHHyGRrX
— 社会人でもOSを作りたい (@uchan_nos) 2019年11月23日