Mercurial > hg > Papers > 2020 > tobaru-master
comparison slide/CbCXv6.md @ 23:49d691a92b41
fix slide
author | tobaru |
---|---|
date | Sat, 08 Feb 2020 19:45:10 +0900 |
parents | 6d84ce92ff35 |
children | 69ac4230c3f2 |
comparison
equal
deleted
inserted
replaced
22:a60721938bf1 | 23:49d691a92b41 |
---|---|
3 - 桃原 優 | 3 - 桃原 優 |
4 | 4 |
5 --- | 5 --- |
6 | 6 |
7 # 概要 | 7 # 概要 |
8 - OS の信頼性を保証したい | 8 - OS の信頼性を上げたい |
9 - メタレベルを記述できる CbC で OS の開発 | 9 - CbCを使って xv6 を書き換える |
10 - インターフェースの導入 | 10 - Paging の書き換えを行った |
11 - 煩雑な記述の解消 | 11 - まだ実装中 |
12 - Agdaによる証明のため | 12 - 将来はコンテナやVMをメタ計算として実装できるはず |
13 | 13 |
14 --- | 14 --- |
15 | 15 |
16 # OS の信頼性の重要性 | 16 # OS の信頼性を上げたい |
17 - OS のバグは日常生活に支障をきたす | 17 - 仕様を満たすことを証明する |
18 - パスワードなしで root にアクセスできるバグ | 18 - 証明しやすい形の記述を作る |
19 - 日付設定でコンピュータが壊れる | 19 - CbCの goto で書く |
20 - -> OS自体に信頼性が求められる | 20 - 状態遷移系に近い形で記述できる |
21 | 21 - 関数型の記述 |
22 --- | 22 - CbCのinterface で書く |
23 | 23 - 記述のモジュール化 |
24 # OS の検証 | |
25 | |
26 - 全てのOSのコードに対して検証を行うのは困難 | |
27 - 複雑な機能が多い | |
28 - 短期間のアップデート | |
29 | |
30 - ユーザーが検証を行うこともできない | |
31 - 資源管理はOSが行なってる | |
32 - そもそも資源管理が複雑 | |
33 - アクセスされたり書き換えられるリスク | |
34 | 24 |
35 --- | 25 --- |
36 | 26 |
37 # メタレベルとノーマルレベル | 27 # メタレベルとノーマルレベル |
38 - ノーマルレベル | 28 - ノーマルレベル |
39 - ユーザーがプログラミング言語によって記述する部分の処理 | 29 - CbCで記述される普通のアルゴリズム |
40 - メタレベル | 30 - メタレベル |
41 - ユーザーが記述しないOS 側の処理 | 31 - Paging などのメモリやCPU自体の操作 |
42 - CPU | 32 - プログラムの正しさの証明 |
43 - メモリ | 33 - Context |
34 - メタレベルで使用される Meta Data を置く場所 | |
44 | 35 |
45 --- | 36 --- |
46 | 37 |
47 # Continuation based C | 38 # Continuation based C |
48 - ノーマルレベルとメタレベルの処理を同じ言語で行えるようにした言語(以下CbC) | 39 - ノーマルレベルとメタレベルの処理を同じ言語で行えるようにした言語(以下CbC) |
49 - Code Gear | 40 - Code Gear |
50 - 基本的な処理の単位 | 41 - 基本的な処理の単位 |
42 - goto 文で遷移する | |
51 - Data Gear | 43 - Data Gear |
52 - データの単位 | 44 - データの単位 |
45 - Meta Code Gear | |
46 - goto meta | |
47 - Code Gear の間に挟める計算 | |
48 - Meta Data Gear | |
49 - Context | |
50 - Code Gearの間の接続など | |
53 | 51 |
54 --- | 52 --- |
55 | 53 |
56 # goto による継続 | 54 # goto による継続 |
57 | 55 |
64 | 62 |
65 # Data Gear の継続 | 63 # Data Gear の継続 |
66 - goto の際に Data Gear も継続される | 64 - goto の際に Data Gear も継続される |
67 | 65 |
68 ![](https://i.imgur.com/3E0DGWA.png) | 66 ![](https://i.imgur.com/3E0DGWA.png) |
69 | |
70 --- | |
71 | |
72 # Meta Code Gear | |
73 - 実際にはノーマルレベルの間にメタレベルの処理がある | |
74 - Meta Level では Data Gear の見え方は変わる(Meta Data Gear) | |
75 - 書き換えやアクセスを防ぐため | |
76 | |
77 ![](https://i.imgur.com/vy0NxrG.png) | |
78 | |
79 --- | |
80 | |
81 # 状態遷移モデル | |
82 - goto の遷移によって状態遷移モデルに落とし込める | |
83 - Code Gear に対しての入力に対して期待される出力がされているかで検査して**信頼性を保証する** | |
84 | |
85 ---- | |
86 | |
87 # Agda による検証 | |
88 - モデル検査 | |
89 - 定理証明支援系である Agda を用いる。 | |
90 - Agda | |
91 - Hoare Logic という検証手法を扱える。 | |
92 | |
93 --- | |
94 | |
95 # Hoare Logic | |
96 - 検証手法 | |
97 - 事前条件を使ってある関数を実行して事後条件を満たすことを確認する | |
98 - CbCと相性がいい | |
99 - 継続に事前条件(Input Data Gear)と事後条件(Output Data Gear)を持たせることができる | |
100 | |
101 --- | |
102 | |
103 # Geas OS | |
104 - CbC を使って信頼性の保証と拡張性を持たせる Gears OS の開発を行なっている | |
105 - Xv6 という OS を参考に書き換えをしている | |
106 | |
107 --- | |
108 | |
109 # メモリ管理 | |
110 - OS の信頼性の1つであるメモリ管理部分を CbC で書き換える | |
111 - Page のバリデーションチェック | |
112 - サンドボックスによるエクセプション | |
113 | 67 |
114 --- | 68 --- |
115 | 69 |
116 # インターフェース | 70 # インターフェース |
117 - 書き換えを防ぐために見える Data Gear に違いが生じる | 71 - 書き換えを防ぐために見える Data Gear に違いが生じる |
121 - 機能の入れ替え | 75 - 機能の入れ替え |
122 - Agda による証明 | 76 - Agda による証明 |
123 | 77 |
124 --- | 78 --- |
125 | 79 |
126 # CbC による Gears OS の開発 | 80 |
127 | 81 # Meta Code Gear |
128 --- | 82 - 実際にはノーマルレベルの間にメタレベルの処理がある |
129 | 83 - Meta Level では Data Gear の見え方は変わる(Meta Data Gear) |
130 # Context | 84 - 書き換えやアクセスを防ぐため |
131 - Meta Data Gear | 85 |
132 - Code Gear | 86 ![](https://i.imgur.com/vy0NxrG.png) |
133 - Data Gear のリスト | 87 |
134 - Data Gear を確保するメモリ空間 | 88 --- |
135 - スレッドやプロセスに対応 | 89 |
136 - ノーマルレベルに必要な処理のみ Code Gear に渡す | 90 # Geas OS |
137 - Meta Code Gear は Perlスクリプトで自動生成 | 91 - Xv6 をCbCで書き換える |
138 - 継続先を変えることで機能を置き換えることも可能 | |
139 | |
140 --- | |
141 | |
142 # Xv6 | |
143 - MIT の講義用教材として作られたOS | 92 - MIT の講義用教材として作られたOS |
144 - 企画課される前のCで書かれたUNIX V6 を書き換えた | 93 - 企画課される前のCで書かれたUNIX V6 を書き換えた |
145 - 1万行程の軽量なOS | 94 - 1万行程の軽量なOS |
146 - Linuxだと数千万行 | 95 - Linuxだと数千万行 |
147 - Xv6 を参考に CbC で書き直すことで Gears OS を実装する | 96 - Xv6 を参考に CbC で書き直すことで Gears OS を実装する |
148 | 97 |
149 --- | 98 --- |
150 | 99 |
100 | |
101 # Xv6の構成 | |
102 - systemcall | |
103 - Scheduler | |
104 - VM | |
105 - file system | |
106 - tty | |
107 | |
108 | |
109 --- | |
110 | |
111 # Context | |
112 - Meta Data Gear | |
113 - ユーザープロセスに対応して1つのcontextがある | |
114 - Contextには実行されるすべてのCode Gear が登録される | |
115 - Data GearもContext上にある | |
116 | |
117 --- | |
151 # カーネル空間 | 118 # カーネル空間 |
152 - OS の中核となるプログラムで Meta Level に相当する | 119 - OS の中核となるプログラムで Meta Level に相当する |
153 - Xv6 ではカーネルとユーザープログラムは分離されている | 120 - Xv6 ではカーネルとユーザープログラムは分離されている |
154 - ユーザープログラムはカーネルに直接アクセスできない。 | 121 - ユーザープログラムはカーネルに直接アクセスできない。 |
155 - 書き換えやアクセスを防ぐため | 122 - 書き換えやアクセスを防ぐため |
156 - 呼び出す場合は system call | 123 - 呼び出す場合は system call |
157 | 124 |
158 --- | 125 --- |
159 | 126 |
160 # カーネルが提供するもの | |
161 - プロセス管理 | |
162 - メモリ管理 | |
163 - ファイル管理 | |
164 - I/O, read, write | |
165 | |
166 | |
167 --- | |
168 | |
169 # カーネルの保護機構 | |
170 - CPUのハードウェア保護機構を持っている | |
171 - ユーザー空間で実行されているプロセスが自身のメモリのみアクセスできるように保護 | |
172 - system call | |
173 - ハードウェアが一時的に特権レベルをあげ、カーネルのプログラムが実行される | |
174 | |
175 --- | |
176 | |
177 # system call | 127 # system call |
178 - system call 呼び出し | 128 - system call 呼び出し |
179 - トラップ の発生 | 129 - トラップ の発生 |
180 - ユーザープログラムの中断 | 130 - ユーザープログラムの中断 |
181 - 処理がカーネルに切り替わる | 131 - 処理がカーネルに切り替わる |
182 | 132 |
183 --- | |
184 | |
185 # Xv6-rpi | |
186 - Xv6 は Arm のバイナリを出力するので様々なハードウェアで動かすことができる | |
187 - Raspberry Pi | |
188 - 携帯電話 | |
189 - 実際にRaspberry Pi で動かすために xv6-rpi を用意して動作しているか確認中 | |
190 - CbCxv6 とは別のプロジェクト | |
191 | |
192 --- | |
193 | |
194 # CbCXv6 での Paging | 133 # CbCXv6 での Paging |
195 - OS の信頼性の1つであるメモリ管理部分の書き換えについて説明 | 134 - OS の信頼性の1つであるメモリ管理部分 |
196 | 135 - メモリ管理するpage table |
197 --- | |
198 | |
199 # 実メモリの直接操作 | |
200 - 実メモリを直接扱うと様々な問題が生じる | |
201 - ユーザープログラムで空いているメモリ番地を探す必要 | |
202 - フラグメンテーションが起こる | |
203 - メモリ間に扱うには小さな隙間ができる | |
204 | |
205 --- | |
206 | |
207 # Paging | |
208 - メモリ管理の手法 | |
209 - Page と呼ばれる固定長のブロックに分割して、メモリとスワップ領域で Page を入れ替えて管理 | 136 - Page と呼ばれる固定長のブロックに分割して、メモリとスワップ領域で Page を入れ替えて管理 |
210 - 仮想メモリとして扱うことでフラグメンテーションの解消と空き番地を探す必要がなくなる | 137 - 仮想メモリとして扱うことでフラグメンテーションの解消と空き番地を探す必要がなくなる |
211 | 138 |
212 --- | 139 --- |
213 | 140 |
215 - 必要? | 142 - 必要? |
216 ![](https://i.imgur.com/ZNxOsNf.png) | 143 ![](https://i.imgur.com/ZNxOsNf.png) |
217 | 144 |
218 | 145 |
219 --- | 146 --- |
220 | |
221 # メタレベルでの Paging の操作 | |
222 - Page Table に相当するデータを Input Data Gear で受け取って変更した後、Context にある Meta Data Gear に goto で遷移してアクセス | |
223 - メタレベルで処理することで本来カーネル側の処理である Page Table を操作できる | |
224 | |
225 --- | |
226 | |
227 # Paging の信頼性 | |
228 - Input Data Gear に対しての Output Data Gear をバリデーションチェックすることで他のプロセスから書き換えられることを防ぐ | |
229 - サンドボックス | |
230 - 他のプロセスから書き換えられた時にエクセプションを飛ばす | |
231 | |
232 --- | |
233 | |
234 # Paging の書き換え | |
235 - Xv6 では実メモリから仮想メモリの変換をvm.cで行なっている。 | |
236 - 次の章で書き換えについて説明する | |
237 | |
238 | |
239 | |
240 --- | |
241 | |
242 # CbC インターフェースの導入 | |
243 - 継続の記述が煩雑になる | |
244 - Code Gear がどの Data Gear の番号に対応するか指定する必要がある | |
245 - ノーマルレベルとメタレベルで Data Gear の見え方が異なるため調整する必要がある | |
246 - ->インターフェースの導入 | |
247 | |
248 | |
249 --- | |
250 | |
251 # CbC インターフェース | 147 # CbC インターフェース |
252 - インターフェースは Data Gear に対しての操作を行う Code Gear | 148 - インターフェースは Data Gear に対しての操作を行う Code Gear |
253 - 実装は別で定義し、呼び出す | 149 - 実装は別で定義し、呼び出す |
254 - インターフェースによって機能を置き換えることができる | 150 - インターフェースによって機能を置き換えることができる |
255 | 151 |
274 ``` c | 170 ``` c |
275 typedef struct vm<Type,Impl> { | 171 typedef struct vm<Type,Impl> { |
276 ``` | 172 ``` |
277 | 173 |
278 --- | 174 --- |
175 | |
176 # init_vmm | |
177 | |
279 | 178 |
280 # Code Gear の定義 | 179 # Code Gear の定義 |
281 - Code Gear は __Code CodeGear名(引数); で記述する | 180 - Code Gear は __Code CodeGear名(引数); で記述する |
282 - 第1引数の Impl* vm が Code Gear の型になる | 181 - 第1引数の Impl* vm が Code Gear の型になる |
283 - 初期化された Data Gear が それぞれの Code Gear の引数として扱われる | 182 - 初期化された Data Gear が それぞれの Code Gear の引数として扱われる |