# HG changeset patch # User mir3636 # Date 1550038559 -32400 # Node ID ecf9d73f18f591aaf10c3867d679734cd8bd2d89 # Parent 09c168f8116acc066e655603805549bb6862f076 update diff -r 09c168f8116a -r ecf9d73f18f5 paper/evaluation.tex --- a/paper/evaluation.tex Wed Feb 13 09:47:53 2019 +0900 +++ b/paper/evaluation.tex Wed Feb 13 15:15:59 2019 +0900 @@ -9,7 +9,7 @@ Gears OS の モジュール化について評価を行う。 モジュール化されていない以前の Gears OS ではソースコード \ref{prevgear} 4行目のように、 Code Gear 直接指定しなければならなかった。 -Interface を用いた ソースコード \ref{intergear} ではここを stack->push のように抽象化することができる。 +Interface を用いた ソースコード \ref{intergear} ではここを stack$->$push のように抽象化することができる。 また、Gears OS では、ある Data Gear を Code Gear が扱う場合、 Code Gear に対応する Data Gear を Context が持つ Data Gear のリストから取り出す必要があるが、 diff -r 09c168f8116a -r ecf9d73f18f5 slide/slide.html --- a/slide/slide.html Wed Feb 13 09:47:53 2019 +0900 +++ b/slide/slide.html Wed Feb 13 15:15:59 2019 +0900 @@ -2,7 +2,7 @@ - 継続を基本とした言語による OS のモジュール化 + 継続を基本とした言語による<br> OS のモジュール化 @@ -66,7 +66,7 @@
-

継続を基本とした言語による OS のモジュール化

+

継続を基本とした言語による
OS のモジュール化

@@ -86,7 +86,7 @@ @@ -175,6 +175,31 @@
+

目次

+ + + +
+
+ +

目次

+ + + +
+
+

CbC のコード例

+

目次

+ + + +
+
+

Gears でのメタ計算

+

目次

+ + + +
+
+

Context

+## 目次 +- 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 @@
 state
+ +## CbC 書き換えについて +- xv6 のシステムコールを CbC に書き換えると、関数は分割され、継続後の元の環境がなくなるためプロセス構造体に値を保持しておかなくてはならないことがわかった。 +- しかしこれは、操作によってどの値が書き換えられるかということが明示的になり、 +また、このプロセス構造体が Context と同等の役割を果たすことがわかった。 +- プロセス構造体を Context として扱い、Interface を用いてモジュール化することで、値渡しなどは Meta Gear に押し込むことができると考察できる。 + +## まとめ +- Interface の導入と、Meta Gear の自動変換・生成によって、ノーマルレベルのプログラミングの見通しが良くなった。 +- xv6 のシステムコールの書き換えにより、xv6 の CbC 書き換えの方針の考察ができた。 + +## 今後の課題 +- 現在はシステムコールのみの書き換えだが、カーネル全体の書き換えを行う。 +- モジュール化された xv6 の機能を Gears OS のものと書き換えることで Gears OS に OS の機能を持たせる。 +- また、QEMU でのみの動作でしか確認できていないため、実機上での動作を可能にしたい。