comparison 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
comparison
equal deleted inserted replaced
1:664ad87c2740 2:42df4feebde2
82 82
83 codeはContextの表に登録されるが、システム全体のcodeは Database で管理される。その管理は 83 codeはContextの表に登録されるが、システム全体のcodeは Database で管理される。その管理は
84 ファイルシステム上でも良い。codeは証明が付属している場合もあるが、それは何らかの形で 84 ファイルシステム上でも良い。codeは証明が付属している場合もあるが、それは何らかの形で
85 codeGear Databseに格納される。 85 codeGear Databseに格納される。
86 86
87 現状では、証明はAgdaで記述されたデータ構造でしかない。それをcodeGear DBに入れても利用する方法は
88 ないがいくつかの利用法は考えられる。
87 89
90 証明とcodeGearの一致を確認する
91 型整合に使う
92 codeの認証に使う
88 93
94 この大域のcodeGear DBは、kernelを含めたすべてのcodeGearに対するもので全部で共有される。つまり、
95 あらゆるversionを含む共有ライブラリとなる。これは全世界でuniqueなDBとしても良い。
89 96
97 --codeGearのlinkage
90 98
99 Gears OSのあらゆるコードは、codeGear DBのコードの組み合わせになる。しかし、そのためには、
100 Contextから詳細なデータを取り出して、実行し、次のcodeGearを呼び出す時にContextの正しい場所にdataGearを格納する
101 必要がある。これは codeGear 全体に対して必要になる。
91 102
92 --並列実行 103 現状では、これは stubとしてコンパイル時に生成される。
93 104
94 --code table 105 __code checkAndSetAtomicReference(struct AtomicReference* atomic, union Data** ptr, union Data* oldData, union Data* newData, __code next(...), __code fail(...)) {
106 if (__sync_bool_compare_and_swap(ptr, oldData, newData)) {
107 goto next(...);
108 }
109 goto fail(...);
110 }
95 111
96 --dynamic loading 112 では、Context 上には以下の構造と、それを呼び出す stub がある。
97 113
98 --実装 114 struct Atomic {
115 union Data* atomic;
116 union Data** ptr;
117 union Data* oldData;
118 union Data* newData;
119 enum Code checkAndSet;
120 enum Code next;
121 enum Code fail;
122 } Atomic;
99 123
100 --linkの方法 124 __code checkAndSetAtomicReference_stub(struct Context* context) {
125 AtomicReference* atomic = (AtomicReference*)GearImpl(context, Atomic, atomic);
126 Data** ptr = Gearef(context, Atomic)->ptr;
127 Data* oldData = Gearef(context, Atomic)->oldData;
128 Data* newData = Gearef(context, Atomic)->newData;
129 enum Code next = Gearef(context, Atomic)->next;
130 enum Code fail = Gearef(context, Atomic)->fail;
131 goto checkAndSetAtomicReference(context, atomic, ptr, oldData, newData, next, fail);
132 }
133
134 これらは単一のGears OS内で整合する必要がある。実際には、これらは、stubが参照する Context内のoffsetにすぎない。
135 Atomic は dataGear の巨大な Union になっている。これは、GearsAgda でも状況は同じで、巨大な Sum type になっている。
136
137 このContext内での offsetと呼び出すcodeGearの番号が一致すれば、Kernel側で整合性の問題はない。
138
139 --static linkage
140
141 コンパイル時に codeGearの結合が明らかならば、それは一つのcodeGearとしてまとめてよい。Contextへの書き込みもさぼることが
142 可能になる。ただし、時分割実行される場合は、codeGearの切れ目で分割するのと同じ実行が要求される。
143 つまり、割り込み処理などで途中で実行が中断するならば、それはその単位まで実行してから、Contextを切り替える必要がある。
144
145 これを実現する手法はflagを参照する方法や、コードを書き換える方法あるいは、polingを埋め込むなどの方法が考えられる。
146 整合性が不要であれば途中で止めても問題ないが、その場合は register などの状態を従来のOSのように保持する必要がある。
147
148 codeGear単位で正直に分割コンパイルすると最適化の余地がない。しかし、その場合でもJITなどは可能である。
149
150 --boot codeGear
151
152 今の実装では、UEFIから Gears OSが読み出される。Gears OS自体は、x.v6\cite{}と同じで、ファイルシステムを
153 含む一体の binary になっている。
154
155 codeGear DBを実装すれば、かなりの部分を後からロードすることが可能になる。
101 156
102 --まとめ 157 --まとめ