Edited at

過去の難案件 Tronのリプレイスの独自OS作成


はじまり

知人から あんたOS作れるよね?

小さなOS開発してる案件があるんだけど やらない?

大丈夫 専門の社員がいて、そのお手伝いだから

C言語できるよね?

単価も悪くないし、組み込み系もやってみたかったので OKした


背景

知人とはネットゲームで知り合った友達だ

不思議なことに私はネットゲーム上で仕事をもらうことが多々ある

最大手車メーカーのネットワーク管理をしているという知り合いから仕事もらったこともあるし

知人と知り合った当時 私は趣味でカーネルを作っていた

といっても ブートストラップして 16ビットプロテクトモードにジャンプし 32ビットモードにジャンプし

あとはデバイスドライバが手に入らず VGAで色々と表示したり、マルチタスクを最低限実装したりメモリや割り込み

ホントお遊びOSであるが

その話を真に受けて OS開発者として呼ばれた

ぶっちゃけ 下記の本を読んでそのまま実装すればいいのだ

https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB-%E7%AC%AC3%E7%89%88-Daniel-Bovet/dp/487311313X/ref=sr_1_1?ie=UTF8&qid=1546186293&sr=8-1&keywords=LINUX%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB


現場

実際に現場にいった。某 組み込み機器の最大手の大きな会社のプロジェクトだった

今まではTronOSで作っていたが、時代が複雑になり

6連装CDチェンジャー、データ焼く人が増えたからCD-DA以外にも対応してね

ディスクアットワンス以外も マルチセッション、パケットライトにも対応してね

Wav以外にもmp3、wmaにも対応してね・・・

ハードディスク内蔵。フォーマットはEXT4で・・

TronはリアルタイムOSとして素晴らしいのだけど弱点として

上記のような複雑な処理が得意ではなかった

じゃあ 自分たちでOS作ろう!あわよくば組み込みOSのシェアを取ろう!とろんからとろう!

というノリでスタートしたプロジェクトである(私ならTronに拡張してプロジェクトに貢献するんだが・・・)


実際

CPU型番はいわないが 16ビットのよくある組込み用CPUだった

どこまで出来ているのか聞いたら まだ開発に入れてません とのことだった

試作コードをみたら I/Oポートに対して データをIN/OUTしているだけで

デバイスの初期化、最低限の動作をしたのみで、カーネルらしきものは何もなかった

しかし最大の問題はそこではなかった

本来は自社OSが完成間近で、それを見越して OSを使ったアプリケーションチームが3ヶ月後にやってきて

開発が始まり

15ヶ月後には 製品が完成するはずであった

OSが完成しない! アプリケーションチームが仕事出来なくなる!!


裏技の発明

OS開発チームには1名 メカレベルが理解できる人がいて あとは雑魚だった

が、私と彼の2名で頑張っても、3ヶ月でアプリケーション開発開始に持っていく事は出来ない

みんな諦めていたところ


先にエミュつくろうぜ!


との私の発言で 3ヶ月でエミュを作った。

APIの設計はなんとか終わっていたからだ。

そしてそのエミュは、本番OSのテストにも利用されることになったし

アプリケーションのデバッグにも利用され、かなり有用であった


カーネル作ろうぜ!

エミュを作り とりあえずの開発が進まないというピンチは切り抜けたが

スケジュールが1年ちかく押してる事は変わらない

あと半年でカーネル完成させなければ 実機テストに入れない

ので 急ピッチで開発がはじまった

その大手メーカーでは 厳しいカースト制がひかれていて

役員は 屋根付きの駐車場に停められる、大きな個室とフカフカの椅子が与えられ

社員は 会社の前の駐車場にとめられる(新入社員は離れた駐車場) 駅からマイクロバスも利用可能。エアコンのきいた建物に明るい照明、普通の机椅子が与えられ

外注は 車通勤不可。マイクロバス乗車拒否 歩いてこい。エアコンの聞かないプレハブで 電気も暗く 安いクッションのない椅子に 電子レンジや給湯使用不可能

私は外注で入ったが 社内のカーネルチームだったので

社員と同じ環境で開発が出来た

また マイクロバスに乗車するのも許された

そこでタスクを切って作業開始した


タスク管理、割り込み

もともとRTOSを前提としたシステムである

が、タイムスライシングを基本としたシステムも考えたが

用途を考え、あまりマルチタスクで行う必要がなく

協調性マルチタスクをベースにすることにした

割り込み必要タスクは タイマーなりI/Oの割り込みにより、最優先でタスクスイッチる

一般的なタスクは 1秒だかかなり大きな時間専有可能(自主的に開放)

ぶっちゃけ 組み込み系なので シングルタスクなので このぐらいで大丈夫


メモリ管理

やはりBuddyアロケータを使った。ほんとこれは簡単で速くてすばらしい


I/O管理&DMA

DMA関連は作らざるを得なかったが

I/Oの泥臭い部分は 単純にマンパワーでなんとかなるので

能力の足りない人たちに割り振った


フォーマット

ファイルフォーマット関連は もうひとりの優秀エンジニアに作ってもらった

CDや読み込みファイルは デバイスの機能として対応してくれたので(メーカー様マジ感謝)

なんとかなった

(これがなんとかなるなら Tronでよかったんじゃないか・・)


OS完成

なんとかギリギリでOSをリリースすることができた

OSといっても カーネルむき出しなんだけどね


趣味OSと比べて

趣味OSは80686なのでCPUにプロテクトモードがありセグメンテーション ページングがあるが、それらがなく16ビットモードで動くので非常に楽だった

プロテクトモードもあるが今回は使わなかったので非常に楽

趣味OSはちゃんとしたマルチタスクでタスクディスパッチを行っていたが

協調性マルチタスクなので そのあたりが非常に楽

趣味OSには画面出力、コンソール入力、簡単なシェル とあったが、それらがないので圧倒的余裕