comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:e12992dca4a0
1 # CbC による xv6 の FileSystem の書き換え
2 author: Takahiro Sakamoto, Shinji Kono
3
4 profile: 琉球大学工学部情報工学科並列信頼研
5
6 ## 研究目的
7 - OSに対し高い信頼性を実現させたい
8
9 - そのために当研究室ではContinuation based C (CbC)を用いたGearsOSを設計中である
10
11 - 前段階としてシンプルであるが基本的な機能を揃えたOSであるxv6をCbCで書き換える
12
13 - CbCは処理の基本単位をCodeGearとし、stackに値を積む事なくCodeGear間を遷移する
14
15 - CodeGear間は状態遷移であるためOS内部を明確化することができる
16
17 - 本研究ではOS内部の明確化を実現し信頼性を向上させるためにCbCを用いFileSystemを書き換える
18
19 ## 研究概要
20 -
21 ## Continuation based C
22 * Continuation based C (CbC) はこの Code Gear 処理の単位としてプログラミング言語として開発している。
23 * Code Gear は 関数呼び出し時の環境を使わずに次の Code Gear へと goto 文によって遷移する
24 * この goto 文による遷移を軽量継続と呼ぶ
25 * 継続を用いることによって状態遷移ベースでのプログラミングが可能である
26 * CbC は C と互換性のある言語なので、C の関数も呼び出すことができる
27 ## CbC のコード例
28 * CbC では Code Gear は \_\_code Code Gear 名 (引数) の形で記述される
29 * Code Gear は戻り値を持たないので、関数とは異なり return 文は存在しない
30 * goto の後に Code Gear 名と引数を並べて、次の Code Gear の遷移を記述する
31
32 ## CbC のコード例
33 * この goto の行き先を継続と呼び、このときの a+b が次の Code Gear への出力となる
34
35 ```
36 __code cg0(int a, int b){
37 goto cg1(a+b);
38 }
39
40 __code cg1(int c){
41 goto cg2(c);
42 }
43 ```
44 ## CbC の継続
45
46 ## Gears におけるメタ計算
47 * Gears OS ではメタ計算を Meta Code Gear、Meta Data Gear で表現する
48 * Meta Code Gear はノーマルレベルの Code Gear の直後に遷移され、メタ計算を実行する
49 * Meta Code Gear で OS の機能であるメモリ管理やスレッド管理を行う
50
51 ## Meta Gear
52 * Gears OS では、Meta Code Gear は通常の Code Gear の直前、直後に挿入され、メタ計算を実行する
53 * 通常の計算からはメタ計算は見ることができない
54
55
56 ## Context
57 * Gears OS では Context と呼ばれる、使用されるすべての Code Gear、Data Gear を持つ Meta Data Gear を持っている
58 * Gears OS は必要な Code Gear、Data Gear を参照したい場合、この Context を通す必要がある
59 * Context は Meta Data Gear であるため、Meta Code Gear を介してアクセスする
60
61 ## Context
62 * Context は全ての Code Gear のリストを持っており、enum で番号とアドレスを対応付けている
63 ```
64 enum Code {
65 C_popSingleLinkedStack,
66 C_pushSingleLinkedStack,
67 C_stackTest3,
68 C_assert3,
69 ...
70 };
71 ```
72 ```
73 context->code[C_popSingleLinkedStack] = popSingleLinkedStack_stub;
74 context->code[C_pushSingleLinkedStack] = pushSingleLinkedStack_stub;
75 context->code[C_stackTest3] = stackTest3_stub;
76 context->code[C_assert3] = assert3_stub;
77 ```
78
79 ## Context
80 * Data Gear も Code Gear と同様に Context が全ての Data Gear のリストを持っている
81 * Data Gear のリストも enum で管理されている
82 * これは引数格納用の Data Gear の番号である
83 ```
84 enum DataType {
85 D_Code,
86 D_SingleLinkedStack,
87 D_Stack,
88 D_TaskManager,
89 D_Worker,
90 ...
91 };
92 ```
93
94 ## Interface
95 * Code Gear と Data Gear は Interface と呼ばれるまとまりとして記述される
96 * Interface は GearsOS でのモジュール化の仕組み
97 * Interface は使用される Data Gear の定義と、それに対する Code Gear の集合である
98 * Interface の操作に対応する Code Gear の引数は Interface に定義されている Data Gear を通して行われる
99
100 ## Interface の定義
101 * Stack の Interface の例である
102 * typedef struct Interface 名で記述する
103 * Impl は実際に実装した際のデータ構造の型になる
104
105 ```
106 typedef struct Stack<Impl> {
107 union Data* stack;
108 union Data* data;
109 __code next(...);
110 __code whenEmpty(...);
111
112 __code clear(Impl* stack, __code next(...));
113 __code push(Impl* stack, union Data* data, __code next(...));
114 __code pop(Impl* stack, __code next(union Data* ...));
115 __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...));
116
117 }
118 ```
119 ## Interface の定義
120 * Data Gear は 操作する Data Gear と
121 操作に必要な全ての Data Gear Gear が記述されている
122 * \_\_code で記述されているものが操作の Code Gear である
123
124 ```
125 typedef struct Stack<Impl> {
126 union Data* stack;
127 union Data* data;
128 __code next(...);
129 __code whenEmpty(...);
130
131 __code clear(Impl* stack, __code next(...));
132 __code push(Impl* stack, union Data* data, __code next(...));
133 __code pop(Impl* stack, __code next(union Data* ...));
134 __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...));
135
136 }
137 ```
138 ## Interface の実装の記述
139 * ソースコードは Interface の実装の初期化のコードである
140 * 操作の Code Gear には実装した Code Gear の番号が代入されるが、ここを入れ替えることで、複数の実装を持つことができる
141 ```
142 Stack* createSingleLinkedStack(struct Context* context) {
143 struct Stack* stack = new Stack();
144 struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack();
145 stack->stack = (union Data*)singleLinkedStack;
146 singleLinkedStack->top = NULL;
147 stack->push = C_pushSingleLinkedStack;
148 stack->pop = C_popSingleLinkedStack;
149 stack->isEmpty = C_isEmptySingleLinkedStack;
150 stack->clear = C_clearSingleLinkedStack;
151 return stack;
152 }
153 ```
154 ## xv6 の書き換えの方針
155 * xv6 を CbC で書き換え、Gears OS の機能と置き換えることで Gears OS に OS の基本構造を持たせたい
156 * このためには xv6 をモジュール化することで、xv6 の機能を明らかにする必要がある
157 * xv6 の Interface を定義し、Gears OS の機能をこれに合わせることによって実現したい
158
159 ## CbC による FileSystem の書き換え
160
161 ## まとめと今後の方針