annotate slide/CbCXv6.md @ 21:6d84ce92ff35

.
author tobaru
date Sat, 08 Feb 2020 18:59:42 +0900
parents 98cee2f6c919
children 49d691a92b41
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
1 # CbCインターフェースによる CbCXv6 の書き換え
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
2 - 並列信頼研
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
3 - 桃原 優
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
4
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
5 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
6
21
tobaru
parents: 19
diff changeset
7 # 概要
tobaru
parents: 19
diff changeset
8 - OS の信頼性を保証したい
tobaru
parents: 19
diff changeset
9 - メタレベルを記述できる CbC で OS の開発
tobaru
parents: 19
diff changeset
10 - インターフェースの導入
tobaru
parents: 19
diff changeset
11 - 煩雑な記述の解消
tobaru
parents: 19
diff changeset
12 - Agdaによる証明のため
18
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
13
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
14 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
15
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
16 # OS の信頼性の重要性
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
17 - OS のバグは日常生活に支障をきたす
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
18 - パスワードなしで root にアクセスできるバグ
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
19 - 日付設定でコンピュータが壊れる
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
20 - -> OS自体に信頼性が求められる
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
21
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
22 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
23
21
tobaru
parents: 19
diff changeset
24 # OS の検証
18
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
25
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
26 - 全てのOSのコードに対して検証を行うのは困難
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
27 - 複雑な機能が多い
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
28 - 短期間のアップデート
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
29
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
30 - ユーザーが検証を行うこともできない
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
31 - 資源管理はOSが行なってる
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
32 - そもそも資源管理が複雑
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
33 - アクセスされたり書き換えられるリスク
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
34
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
35 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
36
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
37 # メタレベルとノーマルレベル
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
38 - ノーマルレベル
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
39 - ユーザーがプログラミング言語によって記述する部分の処理
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
40 - メタレベル
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
41 - ユーザーが記述しないOS 側の処理
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
42 - CPU
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
43 - メモリ
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
44
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
45 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
46
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
47 # Continuation based C
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
48 - ノーマルレベルとメタレベルの処理を同じ言語で行えるようにした言語(以下CbC)
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
49 - Code Gear
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
50 - 基本的な処理の単位
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
51 - Data Gear
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
52 - データの単位
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
53
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
54 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
55
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
56 # goto による継続
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
57
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
58 - Code Gear の処理の間を goto によって遷移していく
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
59
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
60 ![](https://i.imgur.com/etfQund.png)
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
61
19
tobaru
parents: 18
diff changeset
62
18
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
63 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
64
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
65 # Data Gear の継続
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
66 - goto の際に Data Gear も継続される
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
67
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
68 ![](https://i.imgur.com/3E0DGWA.png)
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
69
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
70 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
71
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
72 # Meta Code Gear
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
73 - 実際にはノーマルレベルの間にメタレベルの処理がある
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
74 - Meta Level では Data Gear の見え方は変わる(Meta Data Gear)
21
tobaru
parents: 19
diff changeset
75 - 書き換えやアクセスを防ぐため
18
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
76
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
77 ![](https://i.imgur.com/vy0NxrG.png)
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
78
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
79 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
80
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
81 # 状態遷移モデル
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
82 - goto の遷移によって状態遷移モデルに落とし込める
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
83 - Code Gear に対しての入力に対して期待される出力がされているかで検査して**信頼性を保証する**
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
84
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
85 ----
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
86
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
87 # Agda による検証
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
88 - モデル検査
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
89 - 定理証明支援系である Agda を用いる。
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
90 - Agda
21
tobaru
parents: 19
diff changeset
91 - Hoare Logic という検証手法を扱える。
18
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
92
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
93 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
94
21
tobaru
parents: 19
diff changeset
95 # Hoare Logic
18
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
96 - 検証手法
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
97 - 事前条件を使ってある関数を実行して事後条件を満たすことを確認する
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
98 - CbCと相性がいい
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
99 - 継続に事前条件(Input Data Gear)と事後条件(Output Data Gear)を持たせることができる
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
100
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
101 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
102
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
103 # Geas OS
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
104 - CbC を使って信頼性の保証と拡張性を持たせる Gears OS の開発を行なっている
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
105 - Xv6 という OS を参考に書き換えをしている
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
106
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
107 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
108
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
109 # メモリ管理
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
110 - OS の信頼性の1つであるメモリ管理部分を CbC で書き換える
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
111 - Page のバリデーションチェック
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
112 - サンドボックスによるエクセプション
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
113
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
114 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
115
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
116 # インターフェース
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
117 - 書き換えを防ぐために見える Data Gear に違いが生じる
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
118 - -> Gears OS のノーマルレベルからメタレベルの記述が記述が煩雑になるためインターフェースを導入
21
tobaru
parents: 19
diff changeset
119 - インターフェースによる他のメリット
18
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
120 - 煩雑な記述の解消
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
121 - 機能の入れ替え
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
122 - Agda による証明
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
123
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
124 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
125
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
126 # CbC による Gears OS の開発
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
127
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
128 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
129
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
130 # Context
21
tobaru
parents: 19
diff changeset
131 - Meta Data Gear
tobaru
parents: 19
diff changeset
132 - Code Gear
tobaru
parents: 19
diff changeset
133 - Data Gear のリスト
tobaru
parents: 19
diff changeset
134 - Data Gear を確保するメモリ空間
tobaru
parents: 19
diff changeset
135 - スレッドやプロセスに対応
tobaru
parents: 19
diff changeset
136 - ノーマルレベルに必要な処理のみ Code Gear に渡す
tobaru
parents: 19
diff changeset
137 - Meta Code Gear は Perlスクリプトで自動生成
tobaru
parents: 19
diff changeset
138 - 継続先を変えることで機能を置き換えることも可能
18
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
139
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
140 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
141
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
142 # Xv6
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
143 - MIT の講義用教材として作られたOS
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
144 - 企画課される前のCで書かれたUNIX V6 を書き換えた
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
145 - 1万行程の軽量なOS
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
146 - Linuxだと数千万行
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
147 - Xv6 を参考に CbC で書き直すことで Gears OS を実装する
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
148
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
149 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
150
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
151 # カーネル空間
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
152 - OS の中核となるプログラムで Meta Level に相当する
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
153 - Xv6 ではカーネルとユーザープログラムは分離されている
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
154 - ユーザープログラムはカーネルに直接アクセスできない。
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
155 - 書き換えやアクセスを防ぐため
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
156 - 呼び出す場合は system call
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
157
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
158 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
159
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
160 # カーネルが提供するもの
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
161 - プロセス管理
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
162 - メモリ管理
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
163 - ファイル管理
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
164 - I/O, read, write
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
165
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
166
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
167 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
168
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
169 # カーネルの保護機構
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
170 - CPUのハードウェア保護機構を持っている
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
171 - ユーザー空間で実行されているプロセスが自身のメモリのみアクセスできるように保護
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
172 - system call
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
173 - ハードウェアが一時的に特権レベルをあげ、カーネルのプログラムが実行される
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
174
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
175 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
176
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
177 # system call
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
178 - system call 呼び出し
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
179 - トラップ の発生
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
180 - ユーザープログラムの中断
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
181 - 処理がカーネルに切り替わる
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
182
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
183 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
184
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
185 # Xv6-rpi
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
186 - Xv6 は Arm のバイナリを出力するので様々なハードウェアで動かすことができる
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
187 - Raspberry Pi
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
188 - 携帯電話
21
tobaru
parents: 19
diff changeset
189 - 実際にRaspberry Pi で動かすために xv6-rpi を用意して動作しているか確認中
tobaru
parents: 19
diff changeset
190 - CbCxv6 とは別のプロジェクト
18
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
191
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
192 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
193
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
194 # CbCXv6 での Paging
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
195 - OS の信頼性の1つであるメモリ管理部分の書き換えについて説明
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
196
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
197 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
198
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
199 # 実メモリの直接操作
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
200 - 実メモリを直接扱うと様々な問題が生じる
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
201 - ユーザープログラムで空いているメモリ番地を探す必要
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
202 - フラグメンテーションが起こる
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
203 - メモリ間に扱うには小さな隙間ができる
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
204
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
205 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
206
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
207 # Paging
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
208 - メモリ管理の手法
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
209 - Page と呼ばれる固定長のブロックに分割して、メモリとスワップ領域で Page を入れ替えて管理
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
210 - 仮想メモリとして扱うことでフラグメンテーションの解消と空き番地を探す必要がなくなる
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
211
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
212 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
213
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
214 # Pagingの図
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
215 - 必要?
21
tobaru
parents: 19
diff changeset
216 ![](https://i.imgur.com/ZNxOsNf.png)
tobaru
parents: 19
diff changeset
217
18
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
218
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
219 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
220
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
221 # メタレベルでの Paging の操作
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
222 - Page Table に相当するデータを Input Data Gear で受け取って変更した後、Context にある Meta Data Gear に goto で遷移してアクセス
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
223 - メタレベルで処理することで本来カーネル側の処理である Page Table を操作できる
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
224
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
225 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
226
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
227 # Paging の信頼性
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
228 - Input Data Gear に対しての Output Data Gear をバリデーションチェックすることで他のプロセスから書き換えられることを防ぐ
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
229 - サンドボックス
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
230 - 他のプロセスから書き換えられた時にエクセプションを飛ばす
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
231
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
232 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
233
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
234 # Paging の書き換え
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
235 - Xv6 では実メモリから仮想メモリの変換をvm.cで行なっている。
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
236 - 次の章で書き換えについて説明する
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
237
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
238
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
239
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
240 ---
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
241
19
tobaru
parents: 18
diff changeset
242 # CbC インターフェースの導入
tobaru
parents: 18
diff changeset
243 - 継続の記述が煩雑になる
tobaru
parents: 18
diff changeset
244 - Code Gear がどの Data Gear の番号に対応するか指定する必要がある
tobaru
parents: 18
diff changeset
245 - ノーマルレベルとメタレベルで Data Gear の見え方が異なるため調整する必要がある
tobaru
parents: 18
diff changeset
246 - ->インターフェースの導入
tobaru
parents: 18
diff changeset
247
tobaru
parents: 18
diff changeset
248
tobaru
parents: 18
diff changeset
249 ---
tobaru
parents: 18
diff changeset
250
tobaru
parents: 18
diff changeset
251 # CbC インターフェース
tobaru
parents: 18
diff changeset
252 - インターフェースは Data Gear に対しての操作を行う Code Gear
tobaru
parents: 18
diff changeset
253 - 実装は別で定義し、呼び出す
tobaru
parents: 18
diff changeset
254 - インターフェースによって機能を置き換えることができる
tobaru
parents: 18
diff changeset
255
tobaru
parents: 18
diff changeset
256 ---
tobaru
parents: 18
diff changeset
257
tobaru
parents: 18
diff changeset
258 # インターフェースの定義
tobaru
parents: 18
diff changeset
259 - Data Gear と Data Gear に対して操作を行う Code Gear の集合を表現する **Meta Data Gear**
tobaru
parents: 18
diff changeset
260
tobaru
parents: 18
diff changeset
261 ---
tobaru
parents: 18
diff changeset
262
tobaru
parents: 18
diff changeset
263 # インターフェースのソースコード
tobaru
parents: 18
diff changeset
264 - vm.c をインターフェースで書き換えた vm.h のコードの説明をしていく
tobaru
parents: 18
diff changeset
265
tobaru
parents: 18
diff changeset
266
tobaru
parents: 18
diff changeset
267 ---
tobaru
parents: 18
diff changeset
268
tobaru
parents: 18
diff changeset
269
tobaru
parents: 18
diff changeset
270 # 実装名の定義
tobaru
parents: 18
diff changeset
271 - typedef struct の直後に実装名(vm)を書く
tobaru
parents: 18
diff changeset
272
tobaru
parents: 18
diff changeset
273
tobaru
parents: 18
diff changeset
274 ``` c
tobaru
parents: 18
diff changeset
275 typedef struct vm<Type,Impl> {
tobaru
parents: 18
diff changeset
276 ```
tobaru
parents: 18
diff changeset
277
tobaru
parents: 18
diff changeset
278 ---
tobaru
parents: 18
diff changeset
279
tobaru
parents: 18
diff changeset
280 # Code Gear の定義
tobaru
parents: 18
diff changeset
281 - Code Gear は __Code CodeGear名(引数); で記述する
tobaru
parents: 18
diff changeset
282 - 第1引数の Impl* vm が Code Gear の型になる
tobaru
parents: 18
diff changeset
283 - 初期化された Data Gear が それぞれの Code Gear の引数として扱われる
tobaru
parents: 18
diff changeset
284 - 例)定義された uinit が kpt_freerange の Code Gear の第1引数と対応している
tobaru
parents: 18
diff changeset
285
tobaru
parents: 18
diff changeset
286
tobaru
parents: 18
diff changeset
287 ``` c
21
tobaru
parents: 19
diff changeset
288 typedef struct vm<Type,Impl> {
19
tobaru
parents: 18
diff changeset
289 __code init_vmm(Impl* vm, __code next(...));
tobaru
parents: 18
diff changeset
290 __code kpt_freerange(Impl* vm, uint low, uint hi, __code next(...));
tobaru
parents: 18
diff changeset
291 __code kpt_alloc(Impl* vm ,__code next(...));
tobaru
parents: 18
diff changeset
292 __code switchuvm(Impl* vm ,struct proc* p, __code next(...));
tobaru
parents: 18
diff changeset
293 __code init_inituvm(Impl* vm, pde_t* pgdir, char* init, uint sz, __code next(...));
tobaru
parents: 18
diff changeset
294 __code loaduvm(Impl* vm,pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...));
tobaru
parents: 18
diff changeset
295 __code allocuvm(Impl* vm, pde_t* pgdir, uint oldsz, uint newsz, __code next(...));
tobaru
parents: 18
diff changeset
296
tobaru
parents: 18
diff changeset
297 ```
tobaru
parents: 18
diff changeset
298
tobaru
parents: 18
diff changeset
299 ---
tobaru
parents: 18
diff changeset
300
tobaru
parents: 18
diff changeset
301
tobaru
parents: 18
diff changeset
302 # next(...)
tobaru
parents: 18
diff changeset
303 - __code next(...) は条件分岐によって複数の継続先が設定される
tobaru
parents: 18
diff changeset
304 - それぞれの Code Gear の引数の1つに設定する
tobaru
parents: 18
diff changeset
305 ``` c
tobaru
parents: 18
diff changeset
306 __code kpt_freerange(Impl* vm, uint low, uint hi, __code next(...));
tobaru
parents: 18
diff changeset
307 ....
tobaru
parents: 18
diff changeset
308 __code next(...);
tobaru
parents: 18
diff changeset
309 } vm;
tobaru
parents: 18
diff changeset
310 ```
tobaru
parents: 18
diff changeset
311
tobaru
parents: 18
diff changeset
312 ---
tobaru
parents: 18
diff changeset
313
tobaru
parents: 18
diff changeset
314 # インターフェースの実装
tobaru
parents: 18
diff changeset
315 - インターフェースの実装は別ファイルで定義する(vm_impl.cbc)
tobaru
parents: 18
diff changeset
316 - ヘッダーファイルの呼び出しは #include ではなく #interface で呼び出す
tobaru
parents: 18
diff changeset
317
tobaru
parents: 18
diff changeset
318 ``` c
tobaru
parents: 18
diff changeset
319 #include "../../context.h"
tobaru
parents: 18
diff changeset
320 #interface "vm.h"
tobaru
parents: 18
diff changeset
321
tobaru
parents: 18
diff changeset
322 ```
tobaru
parents: 18
diff changeset
323
tobaru
parents: 18
diff changeset
324
tobaru
parents: 18
diff changeset
325 ---
tobaru
parents: 18
diff changeset
326
tobaru
parents: 18
diff changeset
327 # create_impl
tobaru
parents: 18
diff changeset
328 - create_imple の関数内で vm の型を定義し、vm->CodeGear名 で対応させていく
tobaru
parents: 18
diff changeset
329 - 実装を Code Gear で記述していく。
tobaru
parents: 18
diff changeset
330
tobaru
parents: 18
diff changeset
331
tobaru
parents: 18
diff changeset
332 ``` c
tobaru
parents: 18
diff changeset
333
tobaru
parents: 18
diff changeset
334 vm* createvm_impl(struct Context* cbc_context) {
tobaru
parents: 18
diff changeset
335 struct vm* vm = new vm();
tobaru
parents: 18
diff changeset
336 ....
tobaru
parents: 18
diff changeset
337 vm->void_ret = C_vm_void_ret;
tobaru
parents: 18
diff changeset
338 vm->init_vmm = C_init_vmmvm_impl;
tobaru
parents: 18
diff changeset
339 vm->kpt_freerange = C_kpt_freerangevm_impl;
tobaru
parents: 18
diff changeset
340 vm->kpt_alloc = C_kpt_allocvm_impl;
tobaru
parents: 18
diff changeset
341 ...
tobaru
parents: 18
diff changeset
342 __code init_vmmvm_impl(struct vm_impl* vm,__code next(...)) {
tobaru
parents: 18
diff changeset
343 initlock(&kpt_mem.lock, "vm");
tobaru
parents: 18
diff changeset
344 kpt_mem.freelist = NULL;
tobaru
parents: 18
diff changeset
345
tobaru
parents: 18
diff changeset
346 goto next(...);
tobaru
parents: 18
diff changeset
347 }
tobaru
parents: 18
diff changeset
348 ```
tobaru
parents: 18
diff changeset
349
tobaru
parents: 18
diff changeset
350 ---
tobaru
parents: 18
diff changeset
351
tobaru
parents: 18
diff changeset
352 # private
tobaru
parents: 18
diff changeset
353 - CbC は信頼性を保証するためにそれぞれの Code Gear を細かくする必要があるので、for文やif文がある場合はさらに実装を分ける
tobaru
parents: 18
diff changeset
354 - Code Gear は基本的にインターフェースで指定された Code Gear 内からのみ継続さ れるため、Java の private メソッドのように扱われる。
tobaru
parents: 18
diff changeset
355 - 実際に vm.c の loaduvm の実装を分けた記述を説明する
tobaru
parents: 18
diff changeset
356
tobaru
parents: 18
diff changeset
357
tobaru
parents: 18
diff changeset
358 ``` c
tobaru
parents: 18
diff changeset
359 int loaduvm (pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz)
tobaru
parents: 18
diff changeset
360 {
tobaru
parents: 18
diff changeset
361 uint i, pa, n;
tobaru
parents: 18
diff changeset
362 pte_t *pte;
tobaru
parents: 18
diff changeset
363
tobaru
parents: 18
diff changeset
364 if ((uint) addr % PTE_SZ != 0) {
tobaru
parents: 18
diff changeset
365 panic("loaduvm: addr must be page aligned");
tobaru
parents: 18
diff changeset
366 }
tobaru
parents: 18
diff changeset
367
tobaru
parents: 18
diff changeset
368 for (i = 0; i < sz; i += PTE_SZ) {
tobaru
parents: 18
diff changeset
369 if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) {
tobaru
parents: 18
diff changeset
370 panic("loaduvm: address should exist");
tobaru
parents: 18
diff changeset
371 }
tobaru
parents: 18
diff changeset
372
tobaru
parents: 18
diff changeset
373 pa = PTE_ADDR(*pte);
tobaru
parents: 18
diff changeset
374
tobaru
parents: 18
diff changeset
375 if (sz - i < PTE_SZ) {
tobaru
parents: 18
diff changeset
376 n = sz - i;
tobaru
parents: 18
diff changeset
377 } else {
tobaru
parents: 18
diff changeset
378 n = PTE_SZ;
tobaru
parents: 18
diff changeset
379 }
tobaru
parents: 18
diff changeset
380
tobaru
parents: 18
diff changeset
381 if (readi(ip, p2v(pa), offset + i, n) != n) {
tobaru
parents: 18
diff changeset
382 return -1;
tobaru
parents: 18
diff changeset
383 }
tobaru
parents: 18
diff changeset
384 }
tobaru
parents: 18
diff changeset
385
tobaru
parents: 18
diff changeset
386 return 0;
tobaru
parents: 18
diff changeset
387 }
tobaru
parents: 18
diff changeset
388 ```
tobaru
parents: 18
diff changeset
389
tobaru
parents: 18
diff changeset
390 ---
tobaru
parents: 18
diff changeset
391
tobaru
parents: 18
diff changeset
392 # goto private
tobaru
parents: 18
diff changeset
393 - vm と同じ create_impl 内で vm_impl を定義し、private で実装する Code Gear を定義する
tobaru
parents: 18
diff changeset
394 - loaduvmvm_impl で goto によって private に遷移する
tobaru
parents: 18
diff changeset
395
tobaru
parents: 18
diff changeset
396
tobaru
parents: 18
diff changeset
397 ``` c
tobaru
parents: 18
diff changeset
398 vm* createvm_impl(struct Context* cbc_context) {
tobaru
parents: 18
diff changeset
399 ...
tobaru
parents: 18
diff changeset
400 struct vm_impl* vm_impl = new vm_impl();
tobaru
parents: 18
diff changeset
401 ...
tobaru
parents: 18
diff changeset
402 vm_impl->loaduvm_ptesize_check = C_loaduvm_ptesize_checkvm_impl;
tobaru
parents: 18
diff changeset
403 ....
tobaru
parents: 18
diff changeset
404 vm->loaduvm = C_loaduvmvm_impl;
tobaru
parents: 18
diff changeset
405 ....
tobaru
parents: 18
diff changeset
406 }
tobaru
parents: 18
diff changeset
407
tobaru
parents: 18
diff changeset
408 __code loaduvmvm_impl(struct vm_impl* vm, pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...)) {
tobaru
parents: 18
diff changeset
409 Gearef(cbc_context, vm_impl)->pgdir = pgdir;
tobaru
parents: 18
diff changeset
410 Gearef(cbc_context, vm_impl)->addr = addr;
tobaru
parents: 18
diff changeset
411 Gearef(cbc_context, vm_impl)->ip = ip;
tobaru
parents: 18
diff changeset
412 Gearef(cbc_context, vm_impl)->offset = offset;
tobaru
parents: 18
diff changeset
413 Gearef(cbc_context, vm_impl)->sz = sz;
tobaru
parents: 18
diff changeset
414 Gearef(cbc_context, vm_impl)->next = next;
tobaru
parents: 18
diff changeset
415
tobaru
parents: 18
diff changeset
416 goto loaduvm_ptesize_checkvm_impl(vm, next(...));
tobaru
parents: 18
diff changeset
417 }
tobaru
parents: 18
diff changeset
418 ```
tobaru
parents: 18
diff changeset
419 ---
tobaru
parents: 18
diff changeset
420
tobaru
parents: 18
diff changeset
421 # private のヘッダー
tobaru
parents: 18
diff changeset
422 - private 側のヘッダーファイルも vm_impl と同じように用意する
tobaru
parents: 18
diff changeset
423
tobaru
parents: 18
diff changeset
424 ``` c
tobaru
parents: 18
diff changeset
425 typedef struct vm_impl<Impl, Isa> impl vm{
tobaru
parents: 18
diff changeset
426 ...
tobaru
parents: 18
diff changeset
427 __code loaduvm_ptesize_check(Type* vm_impl, uint i, pte_t* pte, uint sz,
tobaru
parents: 18
diff changeset
428 __code next(int ret, ...));
tobaru
parents: 18
diff changeset
429 ```
tobaru
parents: 18
diff changeset
430
tobaru
parents: 18
diff changeset
431 ---
tobaru
parents: 18
diff changeset
432
tobaru
parents: 18
diff changeset
433 # private の記述
tobaru
parents: 18
diff changeset
434
tobaru
parents: 18
diff changeset
435 ``` c
tobaru
parents: 18
diff changeset
436 #interface "vm_impl.h"
tobaru
parents: 18
diff changeset
437
tobaru
parents: 18
diff changeset
438 __code loaduvm_ptesize_checkvm_impl(struct vm_impl* vm_impl, __code next(int ret, ...)) {
tobaru
parents: 18
diff changeset
439 char* addr = vm_impl->addr;
tobaru
parents: 18
diff changeset
440
tobaru
parents: 18
diff changeset
441 if ((uint) addr %PTE_SZ != 0) {
tobaru
parents: 18
diff changeset
442 // goto panic
tobaru
parents: 18
diff changeset
443 }
tobaru
parents: 18
diff changeset
444
tobaru
parents: 18
diff changeset
445 goto loaduvm_loopvm_impl(vm_impl, next(ret, ...));
tobaru
parents: 18
diff changeset
446 }
tobaru
parents: 18
diff changeset
447 ```
tobaru
parents: 18
diff changeset
448
tobaru
parents: 18
diff changeset
449 - vm.cではここから for だが CbC は if文の中と外にgoto を用意して実装する
tobaru
parents: 18
diff changeset
450
tobaru
parents: 18
diff changeset
451 ![](https://i.imgur.com/ByA7GVJ.png)
tobaru
parents: 18
diff changeset
452
tobaru
parents: 18
diff changeset
453 ```c
tobaru
parents: 18
diff changeset
454 __code loaduvm_loopvm_impl(struct vm_impl* vm_impl, __code next(int ret, ...)) {
tobaru
parents: 18
diff changeset
455 uint i = vm_impl->i;
tobaru
parents: 18
diff changeset
456 uint sz = vm_impl->sz;
tobaru
parents: 18
diff changeset
457
tobaru
parents: 18
diff changeset
458 if (i < sz) {
tobaru
parents: 18
diff changeset
459 goto loaduvm_check_pgdir(vm_impl, next(ret, ...));
tobaru
parents: 18
diff changeset
460 }
tobaru
parents: 18
diff changeset
461
tobaru
parents: 18
diff changeset
462 goto loaduvm_exit(vm_impl, next(ret, ...));
tobaru
parents: 18
diff changeset
463 }
tobaru
parents: 18
diff changeset
464
tobaru
parents: 18
diff changeset
465
tobaru
parents: 18
diff changeset
466 __code loaduvm_check_pgdir(struct vm_impl* vm_impl, __code next(int ret, ...)) {
tobaru
parents: 18
diff changeset
467 pte_t* pte = vm_impl->pte;
tobaru
parents: 18
diff changeset
468 pde_t* pgdir = vm_impl->pgdir;
tobaru
parents: 18
diff changeset
469 uint i = vm_impl->i;
tobaru
parents: 18
diff changeset
470 char* addr = vm_impl->addr;
tobaru
parents: 18
diff changeset
471 uint pa = vm_impl->pa;
tobaru
parents: 18
diff changeset
472
tobaru
parents: 18
diff changeset
473 if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) {
tobaru
parents: 18
diff changeset
474 // goto panic
tobaru
parents: 18
diff changeset
475 }
tobaru
parents: 18
diff changeset
476 pa = PTE_ADDR(*pte);
tobaru
parents: 18
diff changeset
477
tobaru
parents: 18
diff changeset
478 vm_impl->pte = pte;
tobaru
parents: 18
diff changeset
479 vm_impl->pgdir = pgdir;
tobaru
parents: 18
diff changeset
480 vm_impl->addr = addr;
tobaru
parents: 18
diff changeset
481 vm_impl->pa = pa;
tobaru
parents: 18
diff changeset
482
tobaru
parents: 18
diff changeset
483 goto loaduvm_check_PTE_SZ(vm_impl, next(ret, ...));
tobaru
parents: 18
diff changeset
484 }
tobaru
parents: 18
diff changeset
485
tobaru
parents: 18
diff changeset
486 __code loaduvm_check_PTE_SZ(struct vm_impl* vm_impl, __code next(int ret, ...)) {
tobaru
parents: 18
diff changeset
487 uint sz = vm_impl->sz;
tobaru
parents: 18
diff changeset
488 uint i = vm_impl->i;
tobaru
parents: 18
diff changeset
489 uint n = vm_impl->n;
tobaru
parents: 18
diff changeset
490 struct inode* ip = vm_impl->ip;
tobaru
parents: 18
diff changeset
491 uint pa = vm_impl->pa;
tobaru
parents: 18
diff changeset
492 uint offset = vm_impl->offset;
tobaru
parents: 18
diff changeset
493
tobaru
parents: 18
diff changeset
494 if (sz - i < PTE_SZ) {
tobaru
parents: 18
diff changeset
495 n = sz - i;
tobaru
parents: 18
diff changeset
496 } else {
tobaru
parents: 18
diff changeset
497 n = PTE_SZ;
tobaru
parents: 18
diff changeset
498 }
tobaru
parents: 18
diff changeset
499
tobaru
parents: 18
diff changeset
500 if (readi(ip, p2v(pa), offset + i, n) != n) {
tobaru
parents: 18
diff changeset
501 ret = -1;
tobaru
parents: 18
diff changeset
502 goto next(ret, ...);
tobaru
parents: 18
diff changeset
503 }
tobaru
parents: 18
diff changeset
504
tobaru
parents: 18
diff changeset
505 vm_impl->n = n;
tobaru
parents: 18
diff changeset
506
tobaru
parents: 18
diff changeset
507 goto loaduvm_loopvm_impl(vm_impl, next(ret, ...));
tobaru
parents: 18
diff changeset
508 }
tobaru
parents: 18
diff changeset
509
tobaru
parents: 18
diff changeset
510 __code loaduvm_exit(struct vm_impl* vm_impl, __code next(int ret, ...)) {
tobaru
parents: 18
diff changeset
511 ret = 0;
tobaru
parents: 18
diff changeset
512 goto next(ret, ...);
tobaru
parents: 18
diff changeset
513 }
tobaru
parents: 18
diff changeset
514 ```
18
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
515
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
516
afc36230cf4f slide chapter3,4
tobaru
parents:
diff changeset
517
19
tobaru
parents: 18
diff changeset
518 ``` c
tobaru
parents: 18
diff changeset
519
tobaru
parents: 18
diff changeset
520 int loaduvm (pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz)
tobaru
parents: 18
diff changeset
521 {
tobaru
parents: 18
diff changeset
522 uint i, pa, n;
tobaru
parents: 18
diff changeset
523 pte_t *pte;
tobaru
parents: 18
diff changeset
524
tobaru
parents: 18
diff changeset
525 if ((uint) addr % PTE_SZ != 0) {
tobaru
parents: 18
diff changeset
526 panic("loaduvm: addr must be page aligned");
tobaru
parents: 18
diff changeset
527 }
tobaru
parents: 18
diff changeset
528
tobaru
parents: 18
diff changeset
529 for (i = 0; i < sz; i += PTE_SZ) {
tobaru
parents: 18
diff changeset
530 if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) {
tobaru
parents: 18
diff changeset
531 panic("loaduvm: address should exist");
tobaru
parents: 18
diff changeset
532 }
tobaru
parents: 18
diff changeset
533
tobaru
parents: 18
diff changeset
534 pa = PTE_ADDR(*pte);
tobaru
parents: 18
diff changeset
535
tobaru
parents: 18
diff changeset
536 if (sz - i < PTE_SZ) {
tobaru
parents: 18
diff changeset
537 n = sz - i;
tobaru
parents: 18
diff changeset
538 } else {
tobaru
parents: 18
diff changeset
539 n = PTE_SZ;
tobaru
parents: 18
diff changeset
540 }
tobaru
parents: 18
diff changeset
541
tobaru
parents: 18
diff changeset
542 if (readi(ip, p2v(pa), offset + i, n) != n) {
tobaru
parents: 18
diff changeset
543 return -1;
tobaru
parents: 18
diff changeset
544 }
tobaru
parents: 18
diff changeset
545 }
tobaru
parents: 18
diff changeset
546
tobaru
parents: 18
diff changeset
547 return 0;
tobaru
parents: 18
diff changeset
548 }
tobaru
parents: 18
diff changeset
549 ```
tobaru
parents: 18
diff changeset
550
tobaru
parents: 18
diff changeset
551
tobaru
parents: 18
diff changeset
552 # インターフェースの呼び出し
tobaru
parents: 18
diff changeset
553 - 定義したインターフェースの呼び出しについて説明する
tobaru
parents: 18
diff changeset
554 - CbC の場合 goto による 遷移を行うので、関数呼び出しのように goto 以降のコードを実行できない
tobaru
parents: 18
diff changeset
555 - 例) goto すると戻ってこれないため それ以降が実行されなくなる。
tobaru
parents: 18
diff changeset
556
tobaru
parents: 18
diff changeset
557 ``` c
tobaru
parents: 18
diff changeset
558 void userinit(void)
tobaru
parents: 18
diff changeset
559 {
tobaru
parents: 18
diff changeset
560 struct proc* p;
tobaru
parents: 18
diff changeset
561 extern char _binary_initcode_start[], _binary_initcode_size[];
tobaru
parents: 18
diff changeset
562
tobaru
parents: 18
diff changeset
563 p = allocproc();
tobaru
parents: 18
diff changeset
564 initContext(&p->cbc_context);
tobaru
parents: 18
diff changeset
565
tobaru
parents: 18
diff changeset
566 initproc = p;
tobaru
parents: 18
diff changeset
567
tobaru
parents: 18
diff changeset
568 if((p->pgdir = kpt_alloc()) == NULL) {
tobaru
parents: 18
diff changeset
569 panic("userinit: out of memory?");
tobaru
parents: 18
diff changeset
570 }
tobaru
parents: 18
diff changeset
571
tobaru
parents: 18
diff changeset
572 goto cbc_init_vmm_dummy(&p->cbc_context, p, p->pgdir, _binary_initcode_start, (int)_binary_initcode_size);
tobaru
parents: 18
diff changeset
573 p->sz = PTE_SZ;
tobaru
parents: 18
diff changeset
574
tobaru
parents: 18
diff changeset
575 // craft the trapframe as if
tobaru
parents: 18
diff changeset
576 memset(p->tf, 0, sizeof(*p->tf));
tobaru
parents: 18
diff changeset
577 ~
tobaru
parents: 18
diff changeset
578 ```
tobaru
parents: 18
diff changeset
579
tobaru
parents: 18
diff changeset
580 # 呼び出しの解決
tobaru
parents: 18
diff changeset
581 - 最初の命令は next で戻ってこれるので、dummy の関数を用意してそこで実行する
tobaru
parents: 18
diff changeset
582
tobaru
parents: 18
diff changeset
583 ``` c
tobaru
parents: 18
diff changeset
584 void dummy(struct proc *p, char _binary_initcode_start[], char _binary_initcode_size[])
tobaru
parents: 18
diff changeset
585 {
tobaru
parents: 18
diff changeset
586 // inituvm(p->pgdir, _binary_initcode_start, (int)_binary_initcode_size);
tobaru
parents: 18
diff changeset
587 goto cbc_init_vmm_dummy(&p->cbc_context, p, p->pgdir, _binary_initcode_start, (int)_binary_initcode_size);
tobaru
parents: 18
diff changeset
588
tobaru
parents: 18
diff changeset
589 }
tobaru
parents: 18
diff changeset
590
tobaru
parents: 18
diff changeset
591
tobaru
parents: 18
diff changeset
592
tobaru
parents: 18
diff changeset
593 __ncode cbc_init_vmm_dummy(struct Context* cbc_context, struct proc* p, pde_t* pgdir, char* init, uint sz){//:skip
tobaru
parents: 18
diff changeset
594
tobaru
parents: 18
diff changeset
595 struct vm* vm = createvm_impl(cbc_context);
tobaru
parents: 18
diff changeset
596 // goto vm->init_vmm(vm, pgdir, init, sz , vm->void_ret);
tobaru
parents: 18
diff changeset
597 Gearef(cbc_context, vm)->vm = (union Data*) vm;
tobaru
parents: 18
diff changeset
598 Gearef(cbc_context, vm)->pgdir = pgdir;
tobaru
parents: 18
diff changeset
599 Gearef(cbc_context, vm)->init = init;
tobaru
parents: 18
diff changeset
600 Gearef(cbc_context, vm)->sz = sz ;
tobaru
parents: 18
diff changeset
601 Gearef(cbc_context, vm)->next = C_vm_void_ret ;
tobaru
parents: 18
diff changeset
602 goto meta(cbc_context, vm->init_inituvm);
tobaru
parents: 18
diff changeset
603 }
tobaru
parents: 18
diff changeset
604
tobaru
parents: 18
diff changeset
605
tobaru
parents: 18
diff changeset
606 void userinit(void)
tobaru
parents: 18
diff changeset
607 {
tobaru
parents: 18
diff changeset
608 struct proc* p;
tobaru
parents: 18
diff changeset
609 extern char _binary_initcode_start[], _binary_initcode_size[];
tobaru
parents: 18
diff changeset
610
tobaru
parents: 18
diff changeset
611 p = allocproc();
tobaru
parents: 18
diff changeset
612 initContext(&p->cbc_context);
tobaru
parents: 18
diff changeset
613
tobaru
parents: 18
diff changeset
614 initproc = p;
tobaru
parents: 18
diff changeset
615
tobaru
parents: 18
diff changeset
616 if((p->pgdir = kpt_alloc()) == NULL) {
tobaru
parents: 18
diff changeset
617 panic("userinit: out of memory?");
tobaru
parents: 18
diff changeset
618 }
tobaru
parents: 18
diff changeset
619
21
tobaru
parents: 19
diff changeset
620 dummy(p, _binary_initcode_start, _binary_initcode_size);
tobaru
parents: 19
diff changeset
621 ```
19
tobaru
parents: 18
diff changeset
622
21
tobaru
parents: 19
diff changeset
623