Mercurial > hg > Document > Growi
diff user/menikon/thesis.md @ 0:e12992dca4a0
init from Growi
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 16 Dec 2020 14:05:01 +0900 |
parents | |
children | b6c284fd5ae4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/menikon/thesis.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,161 @@ +# CbC による xv6 の FileSystem の書き換え +author: Takahiro Sakamoto, Shinji Kono + +profile: 琉球大学工学部情報工学科並列信頼研 + +## 研究目的 +- OSに対し高い信頼性を実現させたい + +- そのために当研究室ではContinuation based C (CbC)を用いたGearsOSを設計中である + +- 前段階としてシンプルであるが基本的な機能を揃えたOSであるxv6をCbCで書き換える + +- CbCは処理の基本単位をCodeGearとし、stackに値を積む事なくCodeGear間を遷移する + +- CodeGear間は状態遷移であるためOS内部を明確化することができる + +- 本研究ではOS内部の明確化を実現し信頼性を向上させるためにCbCを用いFileSystemを書き換える + +## 研究概要 +- +## Continuation based C +* Continuation based C (CbC) はこの Code Gear 処理の単位としてプログラミング言語として開発している。 +* Code Gear は 関数呼び出し時の環境を使わずに次の Code Gear へと goto 文によって遷移する +* この goto 文による遷移を軽量継続と呼ぶ +* 継続を用いることによって状態遷移ベースでのプログラミングが可能である +* CbC は C と互換性のある言語なので、C の関数も呼び出すことができる +## CbC のコード例 +* CbC では Code Gear は \_\_code Code Gear 名 (引数) の形で記述される +* Code Gear は戻り値を持たないので、関数とは異なり return 文は存在しない +* goto の後に Code Gear 名と引数を並べて、次の Code Gear の遷移を記述する + +## CbC のコード例 +* この goto の行き先を継続と呼び、このときの a+b が次の Code Gear への出力となる + +``` +__code cg0(int a, int b){ + goto cg1(a+b); +} + +__code cg1(int c){ + goto cg2(c); +} +``` +## CbC の継続 + +## Gears におけるメタ計算 +* Gears OS ではメタ計算を Meta Code Gear、Meta Data Gear で表現する +* Meta Code Gear はノーマルレベルの Code Gear の直後に遷移され、メタ計算を実行する +* Meta Code Gear で OS の機能であるメモリ管理やスレッド管理を行う + +## Meta Gear +* Gears OS では、Meta Code Gear は通常の Code Gear の直前、直後に挿入され、メタ計算を実行する +* 通常の計算からはメタ計算は見ることができない + + +## Context +* Gears OS では Context と呼ばれる、使用されるすべての Code Gear、Data Gear を持つ Meta Data Gear を持っている +* Gears OS は必要な Code Gear、Data Gear を参照したい場合、この Context を通す必要がある +* Context は Meta Data Gear であるため、Meta Code Gear を介してアクセスする + +## Context +* Context は全ての Code Gear のリストを持っており、enum で番号とアドレスを対応付けている +``` +enum Code { + C_popSingleLinkedStack, + C_pushSingleLinkedStack, + C_stackTest3, + C_assert3, + ... +}; +``` +``` +context->code[C_popSingleLinkedStack] = popSingleLinkedStack_stub; +context->code[C_pushSingleLinkedStack] = pushSingleLinkedStack_stub; +context->code[C_stackTest3] = stackTest3_stub; +context->code[C_assert3] = assert3_stub; +``` + +## Context +* Data Gear も Code Gear と同様に Context が全ての Data Gear のリストを持っている +* Data Gear のリストも enum で管理されている +* これは引数格納用の Data Gear の番号である +``` +enum DataType { + D_Code, + D_SingleLinkedStack, + D_Stack, + D_TaskManager, + D_Worker, + ... + }; +``` + +## Interface +* Code Gear と Data Gear は Interface と呼ばれるまとまりとして記述される +* Interface は GearsOS でのモジュール化の仕組み +* Interface は使用される Data Gear の定義と、それに対する Code Gear の集合である +* Interface の操作に対応する Code Gear の引数は Interface に定義されている Data Gear を通して行われる + +## Interface の定義 +* Stack の Interface の例である +* typedef struct Interface 名で記述する +* Impl は実際に実装した際のデータ構造の型になる + +``` +typedef struct Stack<Impl> { + union Data* stack; + union Data* data; + __code next(...); + __code whenEmpty(...); + + __code clear(Impl* stack, __code next(...)); + __code push(Impl* stack, union Data* data, __code next(...)); + __code pop(Impl* stack, __code next(union Data* ...)); + __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); + +} +``` +## Interface の定義 +* Data Gear は 操作する Data Gear と +操作に必要な全ての Data Gear Gear が記述されている +* \_\_code で記述されているものが操作の Code Gear である + +``` +typedef struct Stack<Impl> { + union Data* stack; + union Data* data; + __code next(...); + __code whenEmpty(...); + + __code clear(Impl* stack, __code next(...)); + __code push(Impl* stack, union Data* data, __code next(...)); + __code pop(Impl* stack, __code next(union Data* ...)); + __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); + +} +``` +## Interface の実装の記述 +* ソースコードは Interface の実装の初期化のコードである +* 操作の Code Gear には実装した Code Gear の番号が代入されるが、ここを入れ替えることで、複数の実装を持つことができる +``` +Stack* createSingleLinkedStack(struct Context* context) { + struct Stack* stack = new Stack(); + struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack(); + stack->stack = (union Data*)singleLinkedStack; + singleLinkedStack->top = NULL; + stack->push = C_pushSingleLinkedStack; + stack->pop = C_popSingleLinkedStack; + stack->isEmpty = C_isEmptySingleLinkedStack; + stack->clear = C_clearSingleLinkedStack; + return stack; +} +``` +## xv6 の書き換えの方針 +* xv6 を CbC で書き換え、Gears OS の機能と置き換えることで Gears OS に OS の基本構造を持たせたい +* このためには xv6 をモジュール化することで、xv6 の機能を明らかにする必要がある +* xv6 の Interface を定義し、Gears OS の機能をこれに合わせることによって実現したい + +## CbC による FileSystem の書き換え + +## まとめと今後の方針