comparison code-mangement.ind @ 6:c6bea5a028fd

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 17 Apr 2023 18:28:26 +0900
parents c0d369375b21
children 36b34f6e906a
comparison
equal deleted inserted replaced
5:890dcb9acc8b 6:c6bea5a028fd
1 -title: Gears OSの CodeGear Management 1 -title: Gears OSの CodeGear Management
2 2
3 -author: 河野真治 3 -author: 仲吉菜々子 and 河野真治
4
5 --abstract:
6
7 GearsOSではすべてのプログラムはKernelやdriverを含めて CodeGear
8 で書かれている。これらは、CodeGear のSystem DBに格納される
9 べきである。Microwre OS9でもmoduleという形でメモリに展開さ
10 れていた。CodeGearの集合で一つのアプリやサービスが作られる。
11 このCodeGearnの組み合わせを指定する仕組みが必要である。また、
12 CodeGear を実行時にloadする機構を作ることにより、現在、clnag
13 のlinkerで行っている作業抜きでGearsOSを構成できる。これによ
14 り、GearsOSのbuildを簡単にすることができる。高速化が必要な
15 場合は、複数のCodeGearをまとめて最適化して、一つのCodeGearn
16 にする。しかし、実行時のメタ計算がが必要な場合は、それよう
17 のhookを用意する必要がある。これの仕組みについて考察する。
18
19 --abstract-e:
20
21 In GearsOS, all programs, including kernels and drivers, are
22 written in CodeGear. These should be stored in the System DB
23 of CodeGear. In Microwre OS9, they were deployed in memory
24 as modules. An application or service is created using a set
25 of CodeGear. A mechanism is needed to specify the combination
26 of CodeGear. Additionally, by creating a mechanism to load
27 CodeGear at runtime, GearsOS can be built without the work
28 currently done by the clnag linker. This simplifies the process
29 of building GearsOS. When optimization is necessary, multiple
30 CodeGear can be combined and optimized to create a single CodeGear.
31 However, if runtime metacalculation is necessary, a hook must
32 be provided for it.
4 33
5 --Gears OSによる信頼できるサービス 34 --Gears OSによる信頼できるサービス
6 35
7 サービスやアプリケーションの信頼性は、OSとユーザプログラムのように分離することはできない。 36 サービスやアプリケーションの信頼性は、OSとユーザプログラムのように分離することはできない。
8 プログラムの正しさは基本的にはコードの正しさであり、今のOSのようにコードの管理をユーザ空間の 37 プログラムの正しさは基本的にはコードの正しさであり、今のOSのようにコードの管理をユーザ空間の
9 問題として放り出す方法には限界がある。 38 問題として放り出す方法には限界がある。
10 39
11 Gears OSでは実行単位として codeGear、データ単位として dataGear を使う。さらに、これらは 40 Gears OSでは実行単位として codeGear、データ単位として dataGear を使う。さらに、これらは
12 Monad のようにメタ codeGeearやメタdataGearを持っている。 41 Monad のようにメタ codeGeearやメタdataGearを持っている。
13 42
14 Gears OSでの検証は、Agdaを使った GearsAgdaを用いる。これらの実行と並列実行は、 43 Gears OSでの検証は、Agda\cite{Agda,AgdaWiki}を使った GearsAgdaを用いる。これらの実行と並列実行は、
15 GearsAgdaに対して定義される。当然、すべてのGearsAgdaのcodeGearは、Gears OSに 44 GearsAgdaに対して定義される。当然、すべてのGearsAgdaのcodeGearは、Gears OSに
16 登録されることになる。 45 登録されることになる。
17 46
47 OSでの証明よる検証はいろいろ行なわれているが、Haskellに近い形式に変換することが多い
48 \cite{Klein:2014:CFV:2584468.2560537,Chen:2015:UCH:2815400.2815402,Yang:2010:SLI:1806596.1806610}。
49 Gears OSでは、GearsAgda で直接に記述できる点が新しい。
50
18 この論文では、Gears OSのcodeGearの管理方法について考察する。 51 この論文では、Gears OSのcodeGearの管理方法について考察する。
19 52
20 --Normal and Meta computation 53 --Normal and Meta computation
21 54
22 Gears OSの基本は、CbC (Continuation based C)であり、input interfaceとoutput interfaceを有限な処理で 55 Gears OSの基本は、CbC (Continuation based C)\cite{cbc-github}であり、input interfaceとoutput interfaceを有限な処理で
23 結ぶものになっている。これは、コンパイラの基本ブロックに大体相当する。これはさらに、GearsAgdaの 56 結ぶものになっている。これは、コンパイラの基本ブロックに大体相当する。これはさらに、GearsAgdaの
24 Agdaで記述された invariant あるいは、表示的意味論と直結している。 57 Agdaで記述された invariant あるいは、表示的意味論と直結している。
25 58
26 CbCの記述は以下のようなものである。 59 CbCの記述は以下のようなものである。
27 60
36 この単位で行われ定義される。ハードウェアでの並行実行、割り込み処理などは、それにそって 69 この単位で行われ定義される。ハードウェアでの並行実行、割り込み処理などは、それにそって
37 実装される必要がある。これらは、GearsAgdaでは、外部環境へのアクセスがある。この場合は 70 実装される必要がある。これらは、GearsAgdaでは、外部環境へのアクセスがある。この場合は
38 時刻に対するアクセスである。 71 時刻に対するアクセスである。
39 72
40 OS側からみると、これは詳細のない単なるコードに見える。実行の詳細、つまり、実行に関係する 73 OS側からみると、これは詳細のない単なるコードに見える。実行の詳細、つまり、実行に関係する
41 すべての dataGear 、すべてのcodeGearは、プロセスに相当する Context metaDataGearに格納される。 74 すべての dataGear 、すべてのcodeGearは、プロセスに相当する Context metaDataGear(図\ref{Gears OS})に格納される。
42 75
43 つまり、OSからみた codeGearの実行は、 76 つまり、OSからみた codeGearの実行は、
44 77
45   Contextから詳細を取り出すmeta codeGearの番号から、codeGearを選ぶ 78 meta codeGearの番号から、codeGearを選ぶ
46   それを実行し、continuation としてshcedulerを指定する 79   それを実行し、continuation としてshcedulerを指定する
47   これを CPU worker 毎に実行する 80   これを CPU worker 毎に実行する
48 81
49 ということになる。CPU worker毎に Contextは一つなので、Contextはsingle threadで実行される。 82 ということになる。CPU worker毎に Contextは一つなので、Contextはsingle threadで実行される。
50 これにより、並行実行の単位はcodeGearとなる。 83 これにより、並行実行の単位はcodeGearとなる。
68 meta が書き換えられている場合は、ここで Context switchが起きることになる。 101 meta が書き換えられている場合は、ここで Context switchが起きることになる。
69 102
70 このContext switchでメモリ空間の切り替えが必要かどうかは application に依存する。 103 このContext switchでメモリ空間の切り替えが必要かどうかは application に依存する。
71 もし、codeGearの実行の正しさが証明されているなら、メモリ空間を切り替える必然性はない。 104 もし、codeGearの実行の正しさが証明されているなら、メモリ空間を切り替える必然性はない。
72 実際、Kernel 内や Realtime Monitor では切り替えない方が普通である。 105 実際、Kernel 内や Realtime Monitor では切り替えない方が普通である。
106
107 <center><img src="fig/gears_structure.pdf" alt="Gears OS"></center>
73 108
74 --証明付きのコード 109 --証明付きのコード
75 110
76 GearsAgdaで記述されていれば、codeGearやdataGearは証明を持つ。これらは単なる型なので実行時には 111 GearsAgdaで記述されていれば、codeGearやdataGearは証明を持つ。これらは単なる型なので実行時には
77 実態を持たない。ただし、それを実行時にチェックすることもできる。assertなどと同じ扱いである。 112 実態を持たない。ただし、それを実行時にチェックすることもできる。assertなどと同じ扱いである。
113 自分自身の codeGear の再帰呼び出しで行うと、codeGearの実行が有界な時間に閉じなくなる。 148 自分自身の codeGear の再帰呼び出しで行うと、codeGearの実行が有界な時間に閉じなくなる。
114 なので、loop は軽量継続を用いて、一旦、外にでることになる。これは、この段階でmeta level的に処理が 149 なので、loop は軽量継続を用いて、一旦、外にでることになる。これは、この段階でmeta level的に処理が
115 割り込まれることも意味している。 150 割り込まれることも意味している。
116 151
117 GearsAgda で処理された項は、ContextのdataGearに格納される。また、GearsAgdaのcodeGearは、 152 GearsAgda で処理された項は、ContextのdataGearに格納される。また、GearsAgdaのcodeGearは、
118 Contextのcode tableに格納される。どちらも、メモリ的には番号で管理されることになる。 153 Contextのcode table(図\ref{code table})に格納される。どちらも、メモリ的には番号で管理されることになる。
119 GearsAgda の Context は、その意味で、プロセスのメモリ空間そのものを抽象化したものになっている。 154 GearsAgda の Context は、その意味で、プロセスのメモリ空間そのものを抽象化したものになっている。
120 155
121 156
122 つまり、CbCのcodeGearと GearsAgdaは、normal level ではポインタを使わないのだが、 157 つまり、CbCのcodeGearと GearsAgdaは、normal level ではポインタを使わないのだが、
123 その意味は、CbCと GearsAgda で若干異なる。CbCでの実装は、GearsAgdaでの実装の持つ 158 その意味は、CbCと GearsAgda で若干異なる。CbCでの実装は、GearsAgdaでの実装の持つ
124 性質を保存する必要がある。 159 性質を保存する必要がある。
160
161 <center><img src="fig/codetable.pdf" alt="code table"></center>
125 162
126 --Contextを通した dataGearとcodeGearの連携 163 --Contextを通した dataGearとcodeGearの連携
127 164
128 Gears OSでは、Context はCの構造体であり、一つのContextで使用するdataGearとcodeGearは、そこに格納される。 165 Gears OSでは、Context はCの構造体であり、一つのContextで使用するdataGearとcodeGearは、そこに格納される。
129 複数のContextから、dataGearもcodeGearも共有されることがある。その排他制御は、Gears OSのmeta codeGearに 166 複数のContextから、dataGearもcodeGearも共有されることがある。その排他制御は、Gears OSのmeta codeGearに
152 dataGearもContextから参照される pool に確保される。これの管理は meta dataGear (Gears OSのkernel) 189 dataGearもContextから参照される pool に確保される。これの管理は meta dataGear (Gears OSのkernel)
153 が行う。GearsAgda は、この部分はAgdaが管理するので meta的な管理は行われない。しかし、 190 が行う。GearsAgda は、この部分はAgdaが管理するので meta的な管理は行われない。しかし、
154 Context を用いた並行実行の場合は、Context上での管理の問題が生じる。 191 Context を用いた並行実行の場合は、Context上での管理の問題が生じる。
155 192
156 193
194 --code table
195
196 contextの初期化の中で、code table に実際の codeGear stub へのポインタが初期化される。
197
198 context->code[C_add] = add_stub;
199 context->code[C_checkAndSetAtomicReference]
200 = checkAndSetAtomicReference_stub;
201 context->code[C_clearSingleLinkedQueue] = clearSingleLinkedQueue_stub;
202 context->code[C_clearSynchronizedQueue] = clearSynchronizedQueue_stub;
203 context->code[C_code1] = code1_stub;
204 context->code[C_createTask1] = createTask1_stub;
205 context->code[C_createTask2] = createTask2_stub;
206 context->code[C_decrementTaskCountTaskManagerImpl]
207 = decrementTaskCountTaskManagerImpl_stub;
208 context->code[C_exit_code] = exit_code_stub;
209 context->code[C_getTaskCPUWorker] = getTaskCPUWorker_stub;
210 context->code[C_incrementTaskCountTaskManagerImpl]
211 = incrementTaskCountTaskManagerImpl_stub;
212
213 interfaceの初期化の中で、この番号が interfaceを表す dataGearに格納される。
214
215 Tree* createRedBlackTree(struct Context* context) {
216 struct Tree* tree = &ALLOCATE(context, Tree)->Tree;
217 struct RedBlackTree* redBlackTree
218 = &ALLOCATE(context, RedBlackTree)->RedBlackTree;
219 tree->tree = (union Data*)redBlackTree;
220 redBlackTree->root = NULL;
221 redBlackTree->nodeStack = createSingleLinkedStack(context);
222 tree->put = C_putRedBlackTree;
223 tree->get = C_getRedBlackTree;
224 tree->remove = C_removeRedBlackTree;
225 return tree;
226 }
227
228 この辺の構造は、GearsAgda 側では簡素化されている。実際、pointer を直接操作しないとかも、厳密に守る必要はなく、
229 GearsAgda と CbC での実装が平行していれば問題はない。
230
157 --codeGearのlinkage 231 --codeGearのlinkage
158 232
159 Gears OSのあらゆるコードは、codeGear DBのコードの組み合わせになる。しかし、そのためには、 233 Gears OSのあらゆるコードは、codeGear DBのコードの組み合わせになる。しかし、そのためには、
160 Contextから詳細なデータを取り出して、実行し、次のcodeGearを呼び出す時にContextの正しい場所にdataGearを格納する 234 Contextから詳細なデータを取り出して、実行し、次のcodeGearを呼び出す時にContextの正しい場所にdataGearを格納する
161 必要がある。これは codeGear 全体に対して必要になる。 235 必要がある。これは codeGear 全体に対して必要になる。
162 236
163 現状では、これは stubとしてコンパイル時に生成される。 237 現状では、これは stubとしてコンパイル時に生成される。
164 238
165 __code checkAndSetAtomicReference(struct AtomicReference* atomic, union Data** ptr, union Data* oldData, union Data* newData, __code next(...), __code fail(...)) { 239 __code checkAndSetAtomicReference(struct AtomicReference* atomic,
240 union Data** ptr, union Data* oldData, union Data* newData, __code next(...),
241 __code fail(...)) {
166 if (__sync_bool_compare_and_swap(ptr, oldData, newData)) { 242 if (__sync_bool_compare_and_swap(ptr, oldData, newData)) {
167 goto next(...); 243 goto next(...);
168 } 244 }
169 goto fail(...); 245 goto fail(...);
170 } 246 }
180 enum Code next; 256 enum Code next;
181 enum Code fail; 257 enum Code fail;
182 } Atomic; 258 } Atomic;
183 259
184 __code checkAndSetAtomicReference_stub(struct Context* context) { 260 __code checkAndSetAtomicReference_stub(struct Context* context) {
185 AtomicReference* atomic = (AtomicReference*)GearImpl(context, Atomic, atomic); 261 AtomicReference* atomic = (AtomicReference*)
262 GearImpl(context, Atomic, atomic);
186 Data** ptr = Gearef(context, Atomic)->ptr; 263 Data** ptr = Gearef(context, Atomic)->ptr;
187 Data* oldData = Gearef(context, Atomic)->oldData; 264 Data* oldData = Gearef(context, Atomic)->oldData;
188 Data* newData = Gearef(context, Atomic)->newData; 265 Data* newData = Gearef(context, Atomic)->newData;
189 enum Code next = Gearef(context, Atomic)->next; 266 enum Code next = Gearef(context, Atomic)->next;
190 enum Code fail = Gearef(context, Atomic)->fail; 267 enum Code fail = Gearef(context, Atomic)->fail;
191 goto checkAndSetAtomicReference(context, atomic, ptr, oldData, newData, next, fail); 268 goto checkAndSetAtomicReference(context, atomic,
269 ptr, oldData, newData, next, fail);
192 } 270 }
193 271
194 これらは単一のGears OS内で整合する必要がある。実際には、これらは、stubが参照する Context内のoffsetにすぎない。 272 これらは単一のGears OS内で整合する必要がある。実際には、これらは、stubが参照する Context内のoffsetにすぎない。
195 Atomic は dataGear の巨大な Union になっている。これは、GearsAgda でも状況は同じで、巨大な Sum type になっている。 273 Atomic は dataGear の巨大な Union になっている。これは、GearsAgda でも状況は同じで、巨大な Sum type になっている。
196 274
219 297
220 codeGear単位で正直に分割コンパイルすると最適化の余地がない。しかし、その場合でもJITなどは可能である。 298 codeGear単位で正直に分割コンパイルすると最適化の余地がない。しかし、その場合でもJITなどは可能である。
221 299
222 --boot codeGear 300 --boot codeGear
223 301
224 今の実装では、UEFIから Gears OSが読み出される。Gears OS自体は、x.v6\cite{}と同じで、ファイルシステムを 302 今の実装では、UEFIから Gears OSが読み出される。Gears OS自体は、x.v6\cite{xv6rpi}と同じで、ファイルシステムを
225 含む一体の binary になっている。 303 含む一体の binary になっている。
226 304
227 codeGear DBを実装すれば、かなりの部分を後からロードすることが可能になる。 305 codeGear DBを実装すれば、かなりの部分を後からロードすることが可能になる。
228 306
229 307