Mercurial > hg > Papers > 2019 > mitsuki-master
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 でのみの動作でしか確認できていないため、実機上での動作を可能にしたい。 |