comparison slide/slide.md @ 60:ecf9d73f18f5

update
author mir3636
date Wed, 13 Feb 2019 15:15:59 +0900
parents 09c168f8116a
children
comparison
equal deleted inserted replaced
59:09c168f8116a 60:ecf9d73f18f5
1 title: 継続を基本とした言語による OS のモジュール化 1 title: 継続を基本とした言語による<br> OS のモジュール化
2 author: 宮城 光希 2 author: 宮城 光希
3 profile: 琉球大学理工学研究科 河野研 3 profile: 琉球大学理工学研究科 河野研
4 lang: Japanese 4 lang: Japanese
5 code-engine: coderay 5 code-engine: coderay
6 6
50 - 今回の研究発表は大きく分けて 2部の構成となっている。 50 - 今回の研究発表は大きく分けて 2部の構成となっている。
51 - 第1部では Gears OS のモジュール化の仕組みの導入と解説。 51 - 第1部では Gears OS のモジュール化の仕組みの導入と解説。
52 - 第2部では xv6 の CbC による書き換え について発表する。 52 - 第2部では xv6 の CbC による書き換え について発表する。
53 53
54 ## 目次 54 ## 目次
55 - Code Gear と Data Gear 55 - **Code Gear と Data Gear**
56 - Gears OS におけるメタ計算 56 - Gears OS におけるメタ計算
57 - Context 57 - Context
58 - Meta Code Gear 58 - Meta Code Gear
59 - Interface 59 - Interface
60 - Interface 導入についての評価
60 61
61 ## CbC のコード例 62 ## CbC のコード例
62 - Code Gear は\_\_code Code Gear 名 (引数) の形で記述される。 63 - Code Gear は\_\_code Code Gear 名 (引数) の形で記述される。
63 - Code Gear は戻り値を持たないので、return 文は存在しない。 64 - Code Gear は戻り値を持たないので、return 文は存在しない。
64 - goto Code Gear 名 (引数) で次の Code Gear への遷移を表し、これを継続と呼ぶ。 65 - goto Code Gear 名 (引数) で次の Code Gear への遷移を表し、これを継続と呼ぶ。
101 } TimerImpl; 102 } TimerImpl;
102 .... 103 ....
103 }; 104 };
104 ``` 105 ```
105 106
107 ## 目次
108 - Code Gear と Data Gear
109 - **Gears OS におけるメタ計算**
110 - Context
111 - Meta Code Gear
112 - Interface
113
106 ## Gears でのメタ計算 114 ## Gears でのメタ計算
107 - Gears OS ではメタ計算を Meta Code/Data Gear で表現する。 115 - Gears OS ではメタ計算を Meta Code/Data Gear で表現する。
108 - Meta Code Gear は通常の Code Gear の直後で遷移し、メタ計算を実行する。 116 - Meta Code Gear は通常の Code Gear の直後で遷移し、メタ計算を実行する。
109 - Meta Code Gear で OS の機能であるメモリ管理やスレッド管理を行う。 117 - Meta Code Gear で OS の機能であるメモリ管理やスレッド管理を行う。
110 118
124 - 通常の計算からはメタ計算は見ることができない。 132 - 通常の計算からはメタ計算は見ることができない。
125 <div style="text-align: center;"> 133 <div style="text-align: center;">
126  <img src="./images/meta_gear.pdf" alt="MetaGear" width="600"> 134  <img src="./images/meta_gear.pdf" alt="MetaGear" width="600">
127 </div> 135 </div>
128 136
137 ## 目次
138 - Code Gear と Data Gear
139 - Gears OS におけるメタ計算
140 - **Context**
141 - Meta Code Gear
142 - Interface
143 - Interface 導入についての評価
144
129 ## Context 145 ## Context
130 - Gears OS では Context と呼ばれる、使用されるすべての Code Gear、Data Gear を持つ Meta Data Gear を持っている。 146 - Gears OS では Context と呼ばれる、使用されるすべての Code Gear、Data Gear を持つ Meta Data Gear を持っている。
131 - Gears OS は必要な Code Gear、Data Gear を参照したい場合、この Context を通す必要がある。 147 - Gears OS は必要な Code Gear、Data Gear を参照したい場合、この Context を通す必要がある。
132 - Context は Meta Data Gear であるため、Meta Code Gear を介してアクセスする。 148 - Context は Meta Data Gear であるため、Meta Code Gear を介してアクセスする。
149
150 ## Context
151 - CbC はポインタを扱えるので、アセンブラ的に書けてしまう。
152 - Code Gear は関数型プログラミング的に意味があるように書きたい。
153 - Code Gear は入力された型の決まった Data Gear のみ扱えるように Context を利用する。
133 154
134 ## Context 155 ## Context
135 - Context は全ての Code Gear のリストを持っており、enum で番号とアドレスを対応付けている。 156 - Context は全ての Code Gear のリストを持っており、enum で番号とアドレスを対応付けている。
136 ```c 157 ```c
137 enum Code { 158 enum Code {
162 D_Worker, 183 D_Worker,
163 ... 184 ...
164 }; 185 };
165 ``` 186 ```
166 187
188 ## 目次
189 - Code Gear と Data Gear
190 - Gears OS におけるメタ計算
191 - Context
192 - **Meta Code Gear**
193 - Interface
194 - Interface 導入についての評価
195
167 ## stub Code Gear 196 ## stub Code Gear
168 - ノーマルレベルの Gears OS では継続先に渡す Data Gear は引数の集合に見える。 197 - ノーマルレベルの Gears OS では継続先に渡す Data Gear は引数の集合に見える。
169 - しかし、メタレベルで見ると、Data Gear は Context が管理しており、 198 - しかし、メタレベルで見ると、Data Gear は Context が管理しており、
170 アクセスするには Context を介さなくてはならない。 199 アクセスするには Context を介さなくてはならない。
171 ```c 200 ```c
226 255
227 __code meta(struct Context* context, enum Code next) { 256 __code meta(struct Context* context, enum Code next) {
228 goto (context->code[next])(context); 257 goto (context->code[next])(context);
229 } 258 }
230 ``` 259 ```
260
261 ## 目次
262 - Code Gear と Data Gear
263 - Gears OS におけるメタ計算
264 - Context
265 - Meta Code Gear
266 - **Interface**
267 - Interface 導入についての評価
231 268
232 ## Interface 269 ## Interface
233 - Interface は Gears OS のモジュール化の仕組みである。 270 - Interface は Gears OS のモジュール化の仕組みである。
234 - Interface はある Data Gear と、それに対する操作(API)を行う 271 - Interface はある Data Gear と、それに対する操作(API)を行う
235 Code Gear とその操作に用いる Data Gear の集合を表現する。 272 Code Gear とその操作に用いる Data Gear の集合を表現する。
351 goto pushSingleLinkedStack(context, stack, data, next); 388 goto pushSingleLinkedStack(context, stack, data, next);
352 } 389 }
353 ``` 390 ```
354 391
355 ## 目次 392 ## 目次
356 - xv6 の書き換えの方針について 393 - Code Gear と Data Gear
357 - システムコールの書き換えについての考察 394 - Gears OS におけるメタ計算
358 - 書き換えたシステムコールを追う 395 - Context
396 - Meta Code Gear
397 - Interface
398 - **Interface 導入についての評価**
399
400 ## Interface を用いない pushStack の記述
401 - Interface を用いない場合の Code Gear では、完全にメタレベルとノーマルレベルが分離されておらず、
402 Code Gear の引数の Data Gear に対応する番号を示さなくてはならなかった。
403 - また、継続先も直接指定しなければならなかった。
404
405 ```c
406 __code cg1 (struct Context* context, struct Element* element) {
407 allocate->size = sizeof(struct Node);
408 allocator(context);
409 goto meta(context, putSingleLinkedStack)
410 }
411
412 __code pushSingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, struct Node* node) {
413 ...
414 }
415
416 __code pushSingleLinkedStack_stub(struct Context* context){
417 SingleLinkedStack* stack = &context->data[SingleLinkedStack]->SingleLinkedStack;
418 Node *node = &context->data[context->dataNum]->node;
419 goto pushSingleLinkedStack(context, stack, data);
420 }
421 ```
422
423 ## Interface を用いた pushStack の記述
424 - Interface を用いることでノーマルレベルとメタレベルが分離され、stub も自動生成されるようになった。
425 - 継続先も stack->push となることで、抽象化され、異なる実装にも対応できるようになった。
426 ```c
427 __code cg1 (struct Stack* stack) {
428 struct Node* node1 = new Node();
429 goto stack->push((union Data*)node1,cg2);
430 }
431
432 __code pushSingleLinkedStack(struct SingleLinkedStack* stack, union Data* data, __code next(...)) {
433 ...
434 }
435
436 __code pushSingleLinkedStack_stub(struct Context* context){
437 SingleLinkedStack* stack = (SingleLinkedStack*)context->data[D_Stack]->Stack.stack->Stack.stack;
438 Data* data = &context->data[D_Stack]->Stack->data;
439 enum Code next = &context->data[D_Stack]->Stack->next;
440 goto pushSingleLinkedStack(context, stack, data, next);
441 }
442 ```
443
444 ## 目次
445 - **xv6 の書き換えの方針について**
446 - cbc\_read の実装
447 - CbC 書き換えについての評価
359 448
360 ## xv6 の CbC 書き換え 449 ## xv6 の CbC 書き換え
361 - xv6 は UNIX V6 を x86 向けに再実装した OS である。 450 - xv6 は UNIX V6 を x86 向けに再実装した OS である。
362 - プロセスや仮想メモリ、カーネルとユーザーの分離、割り込み、ファイルシステムなどの基本的な Unix の構造を持つ 451 - プロセスや仮想メモリ、カーネルとユーザーの分離、割り込み、ファイルシステムなどの基本的な Unix の構造を持つ
363 - CbC は Code Gear 間の遷移が goto による継続で行われるため、状態遷移ベースでのプログラミングに適している。 452 - CbC は Code Gear 間の遷移が goto による継続で行われるため、状態遷移ベースでのプログラミングに適している。
370 459
371 ## システムコールの書き換え 460 ## システムコールの書き換え
372 - CbC は C と互換性のある言語であるため、元のソースコードから大きく崩すことなく必要な機能のみを CbC へと書き換えることが可能である。 461 - CbC は C と互換性のある言語であるため、元のソースコードから大きく崩すことなく必要な機能のみを CbC へと書き換えることが可能である。
373 - ここでは実際にシステムコールを CbC で書き換えることによって、状態遷移ベースで書き換えるには何が必要か示すことにした。 462 - ここでは実際にシステムコールを CbC で書き換えることによって、状態遷移ベースで書き換えるには何が必要か示すことにした。
374 - 今回は read システムコールの CbC 書き換えを行なった。 463 - 今回は read システムコールの CbC 書き換えを行なった。
464
465 ## 目次
466 - xv6 の書き換えの方針について
467 - **cbc\_read の実装**
468 - CbC 書き換えについての評価
375 469
376 ## syscall関数 470 ## syscall関数
377 - syscall 関数 はシステムコールを呼び出す関数である。 471 - syscall 関数 はシステムコールを呼び出す関数である。
378 ```c 472 ```c
379 void syscall(void) 473 void syscall(void)
771 cpu->intena = intena; 865 cpu->intena = intena;
772 866
773 goto next(); 867 goto next();
774 } 868 }
775 ``` 869 ```
870 ## 目次
871 - xv6 の書き換えの方針について
872 - cbc\_read の実装
873 - **CbC 書き換えについての評価**
776 874
777 ## read システムコールの遷移図 875 ## read システムコールの遷移図
778 - CbC へ書き換えることで状態遷移ベースのプログラムに書き換えることができた。 876 - CbC へ書き換えることで状態遷移ベースのプログラムに書き換えることができた。
779 - 現在はシステムコールのみだが、カーネル全体を書き換えることで、OS の状態遷移モデルができる。 877 - 現在はシステムコールのみだが、カーネル全体を書き換えることで、OS の状態遷移モデルができる。
780 <div style="text-align: center;"> 878 <div style="text-align: center;">
781  <img src="./images/state.pdf" alt="state" width="600"> 879  <img src="./images/state.pdf" alt="state" width="600">
782 </div> 880 </div>
881
882 ## CbC 書き換えについて
883 - xv6 のシステムコールを CbC に書き換えると、関数は分割され、継続後の元の環境がなくなるためプロセス構造体に値を保持しておかなくてはならないことがわかった。
884 - しかしこれは、操作によってどの値が書き換えられるかということが明示的になり、
885 また、このプロセス構造体が Context と同等の役割を果たすことがわかった。
886 - プロセス構造体を Context として扱い、Interface を用いてモジュール化することで、値渡しなどは Meta Gear に押し込むことができると考察できる。
887
888 ## まとめ
889 - Interface の導入と、Meta Gear の自動変換・生成によって、ノーマルレベルのプログラミングの見通しが良くなった。
890 - xv6 のシステムコールの書き換えにより、xv6 の CbC 書き換えの方針の考察ができた。
891
892 ## 今後の課題
893 - 現在はシステムコールのみの書き換えだが、カーネル全体の書き換えを行う。
894 - モジュール化された xv6 の機能を Gears OS のものと書き換えることで Gears OS に OS の機能を持たせる。
895 - また、QEMU でのみの動作でしか確認できていないため、実機上での動作を可能にしたい。