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 の引数として扱われる