annotate code-mangement.ind @ 2:42df4feebde2

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 15 Apr 2023 16:30:15 +0900
parents 664ad87c2740
children c0d369375b21
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 -title: Gears OSの CodeGear Management
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 -author: 河野真治
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
5 --Gears OSによる信頼できるサービス
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
6
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
7 サービスやアプリケーションの信頼性は、OSとユーザプログラムのように分離することはできない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
8 プログラムの正しさは基本的にはコードの正しさであり、今のOSのようにコードの管理をユーザ空間の
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
9 問題として放り出す方法には限界がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
11 Gears OSでは実行単位として codeGear、データ単位として dataGear を使う。さらに、これらは
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
12 Monad のようにメタ codeGeearやメタdataGearを持っている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
14 Gears OSでの検証は、Agdaを使った GearsAgdaを用いる。これらの実行と並列実行は、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
15 GearsAgdaに対して定義される。当然、すべてのGearsAgdaのcodeGearは、Gears OSに
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
16 登録されることになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
18 この論文では、Gears OSのcodeGearの管理方法について考察する。
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 --Normal and Meta computation
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
22 Gears OSの基本は、CbC (Continuation based C)であり、input interfaceとoutput interfaceを有限な処理で
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
23 結ぶものになっている。これは、コンパイラの基本ブロックに大体相当する。これはさらに、GearsAgdaの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
24 Agdaで記述された invariant あるいは、表示的意味論と直結している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
25
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
26 CbCの記述は以下のようなものである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
27
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
28 __code startTimer(struct TimerImpl* timer, __code next(...)) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
29 struct timeval tv;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
30 gettimeofday(&tv, NULL);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
31 timer->time = tv.tv_sec + (double)tv.tv_usec*1e-6;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
32 goto next(...);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
33 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
34
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
35 nextが軽量継続を表している。このcodeGearの実行は論理的に割り込まれない。つまり、並行実行は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
36 この単位で行われ定義される。ハードウェアでの並行実行、割り込み処理などは、それにそって
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
37 実装される必要がある。これらは、GearsAgdaでは、外部環境へのアクセスがある。この場合は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
38 時刻に対するアクセスである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
39
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
40 OS側からみると、これは詳細のない単なるコードに見える。実行の詳細、つまり、実行に関係する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
41 すべての dataGear 、すべてのcodeGearは、プロセスに相当する Context metaDataGearに格納される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
42
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
43 つまり、OSからみた codeGearの実行は、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
44
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
45   Contextから詳細を取り出すmeta codeGearの番号から、codeGearを選ぶ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
46   それを実行し、continuation としてshcedulerを指定する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
47   これを CPU worker 毎に実行する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
48
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
49 ということになる。CPU worker毎に Contextは一つなので、Contextはsingle threadで実行される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
50 これにより、並行実行の単位はcodeGearとなる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
51 ただし、Context関の共有データがある場合は意味的なずれがでる場合がある。それは、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
52 Contextの実行をそうなるように実装することになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
54 その実装の正しさは、実装を GearsAgdaで記述することより可能になるが、その実装が物理的に一致するかどうかの
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
55 保証はハードウェアの性質に依存する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
56
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
57 外界との対応もメタ計算になるが、それはGearsAgdaによるシミュレーションに対する正しさということになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
58
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
59 scheduler から codeGearへの移行は、以下のmeta codeGear で実装される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
60
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
61 __code meta(struct Context* context, enum Code next) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
62 goto (context->code[next])(context);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
63 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
64
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
66 \verb+context->code[next]+が codeGearのtableの呼び出しになるが、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
67 これは表がコンパイル時に確定し、直接の呼び出しでは、コンパイラが最適化するので、overhead とはならない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
68 meta が書き換えられている場合は、ここで Context switchが起きることになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
69
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
70 このContext switchでメモリ空間の切り替えが必要かどうかは application に依存する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
71 もし、codeGearの実行の正しさが証明されているなら、メモリ空間を切り替える必然性はない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
72 実際、Kernel 内や Realtime Monitor では切り替えない方が普通である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
73
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
74 --証明付きのコード
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
75
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
76 GearsAgdaで記述されていれば、codeGearやdataGearは証明を持つ。これらは単なる型なので実行時には
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
77 実態を持たない。ただし、それを実行時にチェックすることもできる。assertなどと同じ扱いである。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
78
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
79 GearsAgdaの証明に閉じていれば、その範囲内での信頼性がある。しかし、動的にcodeが読み込まれる場合は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
80 そうはならない。その時には、証明しなおす、簡易あるいは詳細なモデル検査を実施するなどが可能だが、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
81 それらが実用的とは限らない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
82
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
83 codeはContextの表に登録されるが、システム全体のcodeは Database で管理される。その管理は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
84 ファイルシステム上でも良い。codeは証明が付属している場合もあるが、それは何らかの形で
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
85 codeGear Databseに格納される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
86
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
87 現状では、証明はAgdaで記述されたデータ構造でしかない。それをcodeGear DBに入れても利用する方法は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
88 ないがいくつかの利用法は考えられる。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
89
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
90 証明とcodeGearの一致を確認する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
91 型整合に使う
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
92 codeの認証に使う
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
93
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
94 この大域のcodeGear DBは、kernelを含めたすべてのcodeGearに対するもので全部で共有される。つまり、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
95 あらゆるversionを含む共有ライブラリとなる。これは全世界でuniqueなDBとしても良い。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
96
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
97 --codeGearのlinkage
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
98
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
99 Gears OSのあらゆるコードは、codeGear DBのコードの組み合わせになる。しかし、そのためには、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
100 Contextから詳細なデータを取り出して、実行し、次のcodeGearを呼び出す時にContextの正しい場所にdataGearを格納する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
101 必要がある。これは codeGear 全体に対して必要になる。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
102
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
103 現状では、これは stubとしてコンパイル時に生成される。
1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
104
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
105 __code checkAndSetAtomicReference(struct AtomicReference* atomic, union Data** ptr, union Data* oldData, union Data* newData, __code next(...), __code fail(...)) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
106 if (__sync_bool_compare_and_swap(ptr, oldData, newData)) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
107 goto next(...);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
108 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
109 goto fail(...);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
110 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
111
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
112 では、Context 上には以下の構造と、それを呼び出す stub がある。
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
114 struct Atomic {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
115 union Data* atomic;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
116 union Data** ptr;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
117 union Data* oldData;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
118 union Data* newData;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
119 enum Code checkAndSet;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
120 enum Code next;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
121 enum Code fail;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
122 } Atomic;
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
124 __code checkAndSetAtomicReference_stub(struct Context* context) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
125 AtomicReference* atomic = (AtomicReference*)GearImpl(context, Atomic, atomic);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
126 Data** ptr = Gearef(context, Atomic)->ptr;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
127 Data* oldData = Gearef(context, Atomic)->oldData;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
128 Data* newData = Gearef(context, Atomic)->newData;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
129 enum Code next = Gearef(context, Atomic)->next;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
130 enum Code fail = Gearef(context, Atomic)->fail;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
131 goto checkAndSetAtomicReference(context, atomic, ptr, oldData, newData, next, fail);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
132 }
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
134 これらは単一のGears OS内で整合する必要がある。実際には、これらは、stubが参照する Context内のoffsetにすぎない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
135 Atomic は dataGear の巨大な Union になっている。これは、GearsAgda でも状況は同じで、巨大な Sum type になっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
136
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
137 このContext内での offsetと呼び出すcodeGearの番号が一致すれば、Kernel側で整合性の問題はない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
139 --static linkage
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
140
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
141 コンパイル時に codeGearの結合が明らかならば、それは一つのcodeGearとしてまとめてよい。Contextへの書き込みもさぼることが
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
142 可能になる。ただし、時分割実行される場合は、codeGearの切れ目で分割するのと同じ実行が要求される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
143 つまり、割り込み処理などで途中で実行が中断するならば、それはその単位まで実行してから、Contextを切り替える必要がある。
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
145 これを実現する手法はflagを参照する方法や、コードを書き換える方法あるいは、polingを埋め込むなどの方法が考えられる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
146 整合性が不要であれば途中で止めても問題ないが、その場合は register などの状態を従来のOSのように保持する必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
147
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
148 codeGear単位で正直に分割コンパイルすると最適化の余地がない。しかし、その場合でもJITなどは可能である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
149
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
150 --boot codeGear
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
151
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
152 今の実装では、UEFIから Gears OSが読み出される。Gears OS自体は、x.v6\cite{}と同じで、ファイルシステムを
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
153 含む一体の binary になっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
154
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
155 codeGear DBを実装すれば、かなりの部分を後からロードすることが可能になる。
0
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156
977222ed78ab first commit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 --まとめ