2014年7月27日日曜日

KOZOS for Blackfin "BlacKOZOS"の設計方針

UOS-LPC800

UOS-LPC800を公開してから早くも一年が経ちました。
思いっきり遊びでしか使えない感じのOSが一部の方に好評で、ここでも述べたようにadafruitでも紹介されたりもしています。


本当は公開後に色々機能追加する事を考えていましたが、LPC-810と組み合わせて紹介されているので、彼に入りきらなくなるのは可哀想です。どうしようかな?と考えていたら1年が経過していました。あらら。

KOZOS

UOS-LPC800は、坂井さんがお作りになったKOZOSが制作のきっかけになっています。


KOZOSは、完全ホビー向けOSでありながらソフトウェア割り込みを使ったシステムコールによる操作を実現するなど、とても興味深い作り込みになっています。坂井さんによるユニークなキャラクタであるニジマス君も見逃せません。

坂井さんの書籍が販売されてから私も早速購入して色々な活動に取り組みました。

"BlacKOZOS" - KOZOS for Blackfin

あれから二年ほど経ち、現在は主にBlackfinを使って色々遊んでいます。
私の場合、新しいプロセッサをいじる場合には、クラスの中で小さいものを選んで使う事にしています。現在はBF592というプロセッサで離散的に遊んでいるのですが、この小さなプロセッサでキビキビ動作するOSを書いてみたくなりました。

名前も決めてあって、BlackfinとKOZOSをかけて、BlacKOZOSです。
とてもブラックな感じ。「ブラッコゾス」です。「ブッコロス」ではありません。

本体OSは何もないのに、キャラクタはもうあります。
完全に順番を間違っています。


"BlacKOZOS"の設計方針

設計は以下のように進める事にしました。

①普通に動作するだけのプログラム

普通に動作するだけのプログラムが、どうしてOSに発展するのか理解できないかもしれませんが、最初のタスクしか実行できないところから"BlacKOZOS"の開発をスタートさせる事にしました。これは、まさにOSを使うことで解決したい問題を提示した形です。ざっくり言うと、複数の仕事を並行し、かつ効率的に処理させたい、複数の仕事を協調動作させたい、という課題。


②割り込み関数でレジスタの退避と復旧

次に、①で動作している仕事を一切阻害する事なく、割り込み処理の中で①で使っているレジスタを退避、復旧させます。ここでは、コンテキストスイッチ、つまりタスクの切り替えは行わず、退避したレジスタをそのまま復旧させます。レジスタ周辺の操作は少しでも間違えると動作しません。このコンテキストスイッチなしのレジスタ退避復旧処理は、正しく実装できた時点で、みかけ上①と同じ処理を提供する事になります。つまり、レジスタの退避と復旧を正しく行いながら、依然としてかなり単純な実行モデルを維持できます。


③コンテキストスイッチを追加する

レジスタの退避復旧が実現できたら、コンテキストスイッチを追加します。②を先行させる事にはもうひとつ別の理由があり、②が実現できた時点でコンテキストスイッチは基本的にC言語で記述できるようになっています。どういうことかと言うと、レジスタ退避作業によって実行中のコンテキストを復旧するためのレジスタは保存されているので、それらをかなり自由に使うC言語を使ってレジスタを汚しても、レジスタ復旧で必要な値へ復旧できるわけです。リンクリストを辿ったりする作業をアセンブラで書くのも面倒なのでうってつけというわけです。


まとめ

今回は大雑把な設計方針について明らかにし、作業の道筋を立てました。
Blackfinの場合、割り込みマスクの取り扱いが1つのポイントかもしれません。
その辺りも後々触れていければと思います。