Mercurial > hg > Papers > 2019 > mitsuki-master
diff slide/slide.md @ 60:ecf9d73f18f5
update
author | mir3636 |
---|---|
date | Wed, 13 Feb 2019 15:15:59 +0900 |
parents | 09c168f8116a |
children |
line wrap: on
line diff
--- a/slide/slide.md Wed Feb 13 09:47:53 2019 +0900 +++ b/slide/slide.md Wed Feb 13 15:15:59 2019 +0900 @@ -1,4 +1,4 @@ -title: 継続を基本とした言語による OS のモジュール化 +title: 継続を基本とした言語による<br> OS のモジュール化 author: 宮城 光希 profile: 琉球大学理工学研究科 河野研 lang: Japanese @@ -52,11 +52,12 @@ - 第2部では xv6 の CbC による書き換え について発表する。 ## 目次 -- Code Gear と Data Gear +- **Code Gear と Data Gear** - Gears OS におけるメタ計算 - Context - Meta Code Gear - Interface +- Interface 導入についての評価 ## CbC のコード例 - Code Gear は\_\_code Code Gear 名 (引数) の形で記述される。 @@ -103,6 +104,13 @@ }; ``` +## 目次 +- Code Gear と Data Gear +- **Gears OS におけるメタ計算** +- Context +- Meta Code Gear +- Interface + ## Gears でのメタ計算 - Gears OS ではメタ計算を Meta Code/Data Gear で表現する。 - Meta Code Gear は通常の Code Gear の直後で遷移し、メタ計算を実行する。 @@ -126,12 +134,25 @@ <img src="./images/meta_gear.pdf" alt="MetaGear" width="600"> </div> +## 目次 +- Code Gear と Data Gear +- Gears OS におけるメタ計算 +- **Context** +- Meta Code Gear +- Interface +- Interface 導入についての評価 + ## 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 +- CbC はポインタを扱えるので、アセンブラ的に書けてしまう。 +- Code Gear は関数型プログラミング的に意味があるように書きたい。 +- Code Gear は入力された型の決まった Data Gear のみ扱えるように Context を利用する。 + +## Context - Context は全ての Code Gear のリストを持っており、enum で番号とアドレスを対応付けている。 ```c enum Code { @@ -164,6 +185,14 @@ }; ``` +## 目次 +- Code Gear と Data Gear +- Gears OS におけるメタ計算 +- Context +- **Meta Code Gear** +- Interface +- Interface 導入についての評価 + ## stub Code Gear - ノーマルレベルの Gears OS では継続先に渡す Data Gear は引数の集合に見える。 - しかし、メタレベルで見ると、Data Gear は Context が管理しており、 @@ -229,6 +258,14 @@ } ``` +## 目次 +- Code Gear と Data Gear +- Gears OS におけるメタ計算 +- Context +- Meta Code Gear +- **Interface** +- Interface 導入についての評価 + ## Interface - Interface は Gears OS のモジュール化の仕組みである。 - Interface はある Data Gear と、それに対する操作(API)を行う @@ -353,9 +390,61 @@ ``` ## 目次 -- xv6 の書き換えの方針について -- システムコールの書き換えについての考察 -- 書き換えたシステムコールを追う +- Code Gear と Data Gear +- Gears OS におけるメタ計算 +- Context +- Meta Code Gear +- Interface +- **Interface 導入についての評価** + +## Interface を用いない pushStack の記述 +- Interface を用いない場合の Code Gear では、完全にメタレベルとノーマルレベルが分離されておらず、 +Code Gear の引数の Data Gear に対応する番号を示さなくてはならなかった。 +- また、継続先も直接指定しなければならなかった。 + +```c +__code cg1 (struct Context* context, struct Element* element) { + allocate->size = sizeof(struct Node); + allocator(context); + goto meta(context, putSingleLinkedStack) +} + +__code pushSingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, struct Node* node) { + ... +} + +__code pushSingleLinkedStack_stub(struct Context* context){ + SingleLinkedStack* stack = &context->data[SingleLinkedStack]->SingleLinkedStack; + Node *node = &context->data[context->dataNum]->node; + goto pushSingleLinkedStack(context, stack, data); +} +``` + +## Interface を用いた pushStack の記述 +- Interface を用いることでノーマルレベルとメタレベルが分離され、stub も自動生成されるようになった。 +- 継続先も stack->push となることで、抽象化され、異なる実装にも対応できるようになった。 +```c +__code cg1 (struct Stack* stack) { + struct Node* node1 = new Node(); + goto stack->push((union Data*)node1,cg2); +} + +__code pushSingleLinkedStack(struct SingleLinkedStack* stack, union Data* data, __code next(...)) { + ... +} + +__code pushSingleLinkedStack_stub(struct Context* context){ + SingleLinkedStack* stack = (SingleLinkedStack*)context->data[D_Stack]->Stack.stack->Stack.stack; + Data* data = &context->data[D_Stack]->Stack->data; + enum Code next = &context->data[D_Stack]->Stack->next; + goto pushSingleLinkedStack(context, stack, data, next); +} +``` + +## 目次 +- **xv6 の書き換えの方針について** +- cbc\_read の実装 +- CbC 書き換えについての評価 ## xv6 の CbC 書き換え - xv6 は UNIX V6 を x86 向けに再実装した OS である。 @@ -373,6 +462,11 @@ - ここでは実際にシステムコールを CbC で書き換えることによって、状態遷移ベースで書き換えるには何が必要か示すことにした。 - 今回は read システムコールの CbC 書き換えを行なった。 +## 目次 +- xv6 の書き換えの方針について +- **cbc\_read の実装** +- CbC 書き換えについての評価 + ## syscall関数 - syscall 関数 はシステムコールを呼び出す関数である。 ```c @@ -773,6 +867,10 @@ goto next(); } ``` +## 目次 +- xv6 の書き換えの方針について +- cbc\_read の実装 +- **CbC 書き換えについての評価** ## read システムコールの遷移図 - CbC へ書き換えることで状態遷移ベースのプログラムに書き換えることができた。 @@ -780,3 +878,18 @@ <div style="text-align: center;"> <img src="./images/state.pdf" alt="state" width="600"> </div> + +## CbC 書き換えについて +- xv6 のシステムコールを CbC に書き換えると、関数は分割され、継続後の元の環境がなくなるためプロセス構造体に値を保持しておかなくてはならないことがわかった。 +- しかしこれは、操作によってどの値が書き換えられるかということが明示的になり、 +また、このプロセス構造体が Context と同等の役割を果たすことがわかった。 +- プロセス構造体を Context として扱い、Interface を用いてモジュール化することで、値渡しなどは Meta Gear に押し込むことができると考察できる。 + +## まとめ +- Interface の導入と、Meta Gear の自動変換・生成によって、ノーマルレベルのプログラミングの見通しが良くなった。 +- xv6 のシステムコールの書き換えにより、xv6 の CbC 書き換えの方針の考察ができた。 + +## 今後の課題 +- 現在はシステムコールのみの書き換えだが、カーネル全体の書き換えを行う。 +- モジュール化された xv6 の機能を Gears OS のものと書き換えることで Gears OS に OS の機能を持たせる。 +- また、QEMU でのみの動作でしか確認できていないため、実機上での動作を可能にしたい。