19
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6 <!DOCTYPE html>
|
|
7 <html>
|
|
8 <head>
|
|
9 <meta http-equiv="content-type" content="text/html;charset=utf-8">
|
46
|
10 <title>GearsOSにおけるinodeを用いたFile systemの実装</title>
|
19
|
11
|
|
12 <meta name="generator" content="Slide Show (S9) v4.1.0 on Ruby 3.0.3 (2021-11-24) [arm64-darwin21]">
|
|
13 <meta name="author" content="又吉 雄斗" >
|
|
14
|
|
15 <!-- style sheet links -->
|
|
16 <link rel="stylesheet" href="s6/themes/projection.css" media="screen,projection">
|
|
17 <link rel="stylesheet" href="s6/themes/screen.css" media="screen">
|
|
18 <link rel="stylesheet" href="s6/themes/print.css" media="print">
|
|
19 <link rel="stylesheet" href="s6/themes/blank.css" media="screen,projection">
|
|
20
|
|
21 <!-- JS -->
|
|
22 <script src="s6/js/jquery-1.11.3.min.js"></script>
|
|
23 <script src="s6/js/jquery.slideshow.js"></script>
|
|
24 <script src="s6/js/jquery.slideshow.counter.js"></script>
|
|
25 <script src="s6/js/jquery.slideshow.controls.js"></script>
|
|
26 <script src="s6/js/jquery.slideshow.footer.js"></script>
|
|
27 <script src="s6/js/jquery.slideshow.autoplay.js"></script>
|
|
28
|
|
29 <!-- prettify -->
|
|
30 <link rel="stylesheet" href="scripts/prettify.css">
|
|
31 <script src="scripts/prettify.js"></script>
|
|
32
|
|
33 <script>
|
|
34 $(document).ready( function() {
|
|
35 Slideshow.init();
|
|
36
|
|
37 $('code').each(function(_, el) {
|
|
38 if (!el.classList.contains('noprettyprint')) {
|
|
39 el.classList.add('prettyprint');
|
|
40 }
|
|
41 });
|
|
42 prettyPrint();
|
|
43 } );
|
|
44
|
|
45 </script>
|
|
46
|
|
47 <!-- Better Browser Banner for Microsoft Internet Explorer (IE) -->
|
|
48 <!--[if IE]>
|
|
49 <script src="s6/js/jquery.microsoft.js"></script>
|
|
50 <![endif]-->
|
|
51
|
|
52
|
|
53
|
|
54 </head>
|
|
55 <body>
|
|
56
|
|
57 <div class="layout">
|
|
58 <div id="header"></div>
|
|
59 <div id="footer">
|
|
60 <div align="right">
|
|
61 <img src="s6/images/logo.svg" width="200px">
|
|
62 </div>
|
|
63 </div>
|
|
64 </div>
|
|
65
|
|
66 <div class="presentation">
|
|
67
|
|
68 <div class='slide cover'>
|
|
69 <table width="90%" height="90%" border="0" align="center">
|
|
70 <tr>
|
|
71 <td>
|
|
72 <div align="center">
|
46
|
73 <h1><font color="#808db5">GearsOSにおけるinodeを用いたFile systemの実装</font></h1>
|
19
|
74 </div>
|
|
75 </td>
|
|
76 </tr>
|
|
77 <tr>
|
|
78 <td>
|
|
79 <div align="left">
|
|
80 又吉 雄斗
|
46
|
81 並列信頼研
|
19
|
82 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;">
|
|
83 </div>
|
|
84 </td>
|
|
85 </tr>
|
|
86 </table>
|
|
87 </div>
|
|
88
|
|
89
|
|
90
|
|
91 <div class='slide'>
|
|
92
|
|
93 <!-- _S9SLIDE_ -->
|
35
|
94 <h2 id="inodeを用いたgearsdirectoryの実装">inodeを用いたgearsDirectoryの実装</h2>
|
|
95
|
|
96 <ul>
|
40
|
97 <li>アプリケーションの信頼性を保証するために,アプリケーションが動作するOSの信頼性を高める必要がある
|
|
98 <ul>
|
|
99 <li>信頼性確保の方法として定理証明やモデル検査がある</li>
|
|
100 </ul>
|
|
101 </li>
|
|
102 <li>当研究室では,信頼性の保証を目的としたGearsOSを開発している</li>
|
|
103 <li>GearsOSで未実装の機能であるファイルシステムの実装を目指す</li>
|
46
|
104 <li><span style="color: red; ">今回はUnix likeにディレクトリシステムを実装した</span></li>
|
35
|
105 <li>GearsOSへUnixのFile systemの仕組みを取り入れるアプローチをとる</li>
|
|
106 <li>GearsOSのディレクトリシステムであるgearsDirectoryについて説明する</li>
|
|
107 </ul>
|
|
108
|
|
109
|
|
110
|
|
111 </div>
|
|
112
|
|
113 <div class='slide'>
|
|
114 <!-- _S9SLIDE_ -->
|
|
115 <h2 id="continuation-based-c">Continuation based C</h2>
|
|
116
|
|
117 <ul>
|
|
118 <li>Cの下位言語である</li>
|
41
|
119 <li>プログラムはCodeGearと呼ばれる処理の単位で記述する</li>
|
|
120 <li>データはDataGearと呼ばれる単位を用いる</li>
|
35
|
121 <li>ノーマルレベルとメタレベルの処理を切り分けることが可能である</li>
|
41
|
122 <li>function callの継続の代わりにgotoによる継続を用いる
|
|
123 <ul>
|
46
|
124 <li>呼び出し履歴を持たないことから軽量継続と呼ぶ</li>
|
41
|
125 </ul>
|
|
126 </li>
|
35
|
127 </ul>
|
|
128
|
|
129 <div style="text-align: center;">
|
|
130 <img src="../paper/figs/dgcgdg.svg" width="1000" />
|
|
131 </div>
|
|
132
|
|
133
|
|
134
|
|
135 </div>
|
|
136
|
|
137 <div class='slide'>
|
|
138 <!-- _S9SLIDE_ -->
|
|
139 <h2 id="gearsos">GearsOS</h2>
|
19
|
140
|
|
141 <ul>
|
41
|
142 <li>当研究室にて,信頼性と拡張性の両立を目的として開発している</li>
|
35
|
143 <li>Gearという概念があり,実行の単位をCodeGear,データの単位をDataGearと呼ぶ</li>
|
46
|
144 <li>同様にGearの概念を持つCbC(Continuation based C)で記述されている</li>
|
44
|
145 <li>軽量継続を基本とし,stackを持たない代わりに全てを従来OSのプロセスに当たるContext経由で実行する</li>
|
35
|
146 <li>ノーマルレベルとメタレベルの処理を切り分けることができる</li>
|
44
|
147 <li>OSとして動作するために今後実装しなければならない機能がいくつか残っている</li>
|
35
|
148 </ul>
|
|
149
|
|
150
|
|
151
|
|
152 </div>
|
|
153
|
|
154 <div class='slide'>
|
|
155 <!-- _S9SLIDE_ -->
|
|
156 <h2 id="gearsos-1">GearsOS</h2>
|
|
157
|
|
158 <h3 id="codegearとmetacodegearの関係">CodeGearとmetaCodeGearの関係</h3>
|
|
159
|
44
|
160 <ul>
|
|
161 <li>ノーマルレベルとメタレベルの存在
|
|
162 <ul>
|
|
163 <li>CodeGearがDataGearを受け取り,処理後にDataGearを次のCodeGearに渡すという動作をしているように見える</li>
|
|
164 <li>実際にはデータの整合性の確認や資源管理などのメタレベルの処理が存在し,それらの計算はMetaCodeGearで行われる</li>
|
|
165 </ul>
|
|
166 </li>
|
|
167 </ul>
|
|
168
|
35
|
169 <div style="text-align: center;">
|
|
170 <img src="../paper/figs/meta_cg_dg.svg" width="1200" />
|
|
171 </div>
|
|
172
|
|
173
|
|
174
|
|
175 </div>
|
|
176
|
|
177 <div class='slide'>
|
|
178 <!-- _S9SLIDE_ -->
|
|
179 <h2 id="gearsos-2">GearsOS</h2>
|
|
180
|
44
|
181 <h3 id="context">Context</h3>
|
|
182
|
|
183 <ul>
|
|
184 <li>GearsOS上全てのCodeGear,DataGearの参照を持つ</li>
|
|
185 <li>OS上の処理の実行単位</li>
|
|
186 <li>Gearの概念ではMetaDataGearに当たる</li>
|
|
187 <li>ノーマルレベルから直接参照されず,必ずMetaDataGearとしてMetaCodeGearから参照される</li>
|
|
188 </ul>
|
|
189
|
|
190 <h3 id="contextの種類">Contextの種類</h3>
|
|
191
|
|
192 <ul>
|
|
193 <li>OS全体のContextを管理するKernel Context</li>
|
|
194 <li>ユーザープログラムごとに存在するUser Context</li>
|
|
195 <li>CPUやGPUごとに存在するCPU Context</li>
|
|
196 </ul>
|
|
197
|
|
198
|
|
199
|
|
200 </div>
|
|
201
|
|
202 <div class='slide'>
|
|
203 <!-- _S9SLIDE_ -->
|
|
204 <h2 id="gearsos-3">GearsOS</h2>
|
|
205
|
35
|
206 <h3 id="contextを参照する流れ">Contextを参照する流れ</h3>
|
|
207
|
|
208 <div style="text-align: center;">
|
41
|
209 <img src="../paper/figs/Context_ref-1.jpg" width="1200" />
|
35
|
210 </div>
|
|
211
|
|
212
|
|
213
|
|
214 </div>
|
|
215
|
|
216 <div class='slide'>
|
|
217 <!-- _S9SLIDE_ -->
|
|
218 <h2 id="unixのfile-system">UnixのFile system</h2>
|
|
219
|
46
|
220 <p>UnixのFile systemはinodeのBTreeで構成されており,xv6もその仕組みを用いている</p>
|
|
221
|
35
|
222 <h3 id="xv6">xv6</h3>
|
|
223
|
|
224 <ul>
|
|
225 <li>MITで教育用の目的で開発されたOS</li>
|
|
226 <li>Unixの基本的な構造を持つ</li>
|
|
227 <li>当研究室ではxv6のCbCでの書き換え,分析を行なっている</li>
|
|
228 <li>File systemではinodeの仕組みが用いられている</li>
|
|
229 </ul>
|
|
230
|
|
231 <h3 id="inode">inode</h3>
|
|
232
|
|
233 <ul>
|
|
234 <li>ファイルの属性情報が書かれたデータである</li>
|
|
235 <li>識別番号としてinode numberを持つ</li>
|
|
236 <li>inodeはファイルシステム始動時にinode領域をディスク上に確保する</li>
|
19
|
237 </ul>
|
|
238
|
|
239
|
|
240
|
|
241 </div>
|
|
242
|
|
243 <div class='slide'>
|
|
244 <!-- _S9SLIDE_ -->
|
35
|
245 <h2 id="gearsfilesystemにおけるdirectoryの構成">GearsFileSystemにおけるdirectoryの構成</h2>
|
|
246
|
41
|
247 <ul>
|
46
|
248 <li>2つのRedBlackTreeを用いる
|
41
|
249 <ol>
|
|
250 <li>inode numberとfileのポインタのペアを持つTree</li>
|
|
251 <li>filenameとinode numberのペアを持つTree</li>
|
|
252 </ol>
|
|
253 </li>
|
46
|
254 <li>カレントディレクトリはgearsDirectory->currentDirectoryに保存される</li>
|
41
|
255 </ul>
|
|
256
|
35
|
257 <div style="text-align: center;">
|
46
|
258 <img src="figs/inode.svg" width="1000" />
|
35
|
259 </div>
|
|
260
|
|
261
|
|
262
|
|
263 </div>
|
|
264
|
|
265 <div class='slide'>
|
|
266 <!-- _S9SLIDE_ -->
|
|
267 <h2 id="unix-like-な-interface">Unix Like な interface</h2>
|
|
268
|
|
269 <h3 id="mkdir">mkdir</h3>
|
|
270
|
|
271 <pre><code class="language-c">__code mkdir(struct GearsDirectoryImpl* gearsDirectory, struct Integer* name, __code next(...)) {
|
|
272 struct FTree* newDirectory = createFileSystemTree(context, gearsDirectory->currentDirectory);
|
|
273 Node* inode = new Node();
|
|
274 inode->key = gearsDirectory->INodeNumber;
|
|
275 inode->value = newDirectory;
|
|
276 struct FTree* cDirectory = new FTree();
|
|
277 cDirectory = gearsDirectory->iNodeTree;
|
|
278 goto cDirectory->put(inode, mkdir2);
|
|
279 }
|
19
|
280
|
35
|
281 __code mkdir2(struct GearsDirectoryImpl* gearsDirectory, struct Integer* name, __code next(...)) {
|
|
282 Node* dir = new Node();
|
|
283 dir->key = name->value;
|
|
284 Integer* iNum = new Integer();
|
|
285 iNum->value = gearsDirectory->INodeNumber;
|
|
286 dir->value = iNum;
|
|
287 gearsDirectory->INodeNumber = gearsDirectory->INodeNumber + 1;
|
|
288 struct FTree* cDirectory = new FTree();
|
|
289 cDirectory = gearsDirectory->currentDirectory;
|
|
290 goto cDirectory->put(dir, next(...));
|
|
291 }
|
|
292 </code></pre>
|
|
293
|
|
294
|
|
295
|
|
296 </div>
|
|
297
|
|
298 <div class='slide'>
|
|
299 <!-- _S9SLIDE_ -->
|
|
300 <h2 id="unix-like-な-interface-1">Unix Like な interface</h2>
|
|
301
|
44
|
302 <h3 id="mkdir-1">mkdir</h3>
|
|
303
|
|
304 <div style="text-align: center;">
|
46
|
305 <img src="figs/mkdir.svg" width="700" />
|
44
|
306 </div>
|
|
307
|
46
|
308 <!--
|
|
309 ## Unix Like な interface
|
44
|
310
|
46
|
311 ### ls
|
35
|
312
|
46
|
313 ```c
|
|
314 __code ls(struct GearsDirectoryImpl* gearsDirectory, struct Integer* name, __code next(...)) {
|
35
|
315 Node* dir = new Node();
|
46
|
316 dir->key = name->value;
|
35
|
317 struct FTree* cDirectory = new FTree();
|
46
|
318 cDirectory = gearsDirectory->currentDirectory;
|
|
319 goto cDirectory->get(dir, ls2);
|
35
|
320 }
|
|
321
|
|
322 __code ls2(struct GearsDirectoryImpl* gearsDirectory, struct Node* node, __code next(...)) {
|
46
|
323 printf("%d\n", node->key);
|
35
|
324 goto next(...);
|
|
325 }
|
46
|
326 ```
|
|
327
|
|
328 ## Unix Like な interface
|
|
329
|
|
330 ### ls
|
|
331
|
|
332 <div style="text-align: center;">
|
|
333 <img src="figs/ls.svg" width="1000">
|
|
334 </div>
|
|
335
|
|
336 ## Unix Like な interface
|
|
337
|
|
338 ### cd
|
|
339
|
|
340 ```c
|
|
341 __code cd2Child(struct GearsDirectoryImpl* gearsDirectory, struct Integer* name, __code next(...)) {
|
|
342 struct FTree* cDirectory = new FTree();
|
|
343 cDirectory = gearsDirectory->currentDirectory;
|
|
344 struct Node* node = new Node();
|
|
345 node->key = name->value;
|
|
346 goto cDirectory->get(node, cd2Child2);
|
|
347 }
|
|
348
|
|
349 __code cd2Child2(struct GearsDirectoryImpl* gearsDirectory, struct Node* node, __code next(...)) {
|
|
350 struct FTree* iNodeTree = new FTree();
|
|
351 iNodeTree = gearsDirectory->iNodeTree;
|
|
352 goto iNodeTree->get(node->value, cd2Child3);
|
|
353 }
|
|
354
|
|
355 __code cd2Child3(struct GearsDirectoryImpl* gearsDirectory, struct Node* node, __code next(...)) {
|
|
356 gearsDirectory->currentDirectory = node->value;
|
|
357 goto next(...);
|
|
358 }
|
|
359 ```
|
|
360
|
|
361 ## Unix Like な interface
|
|
362
|
|
363 ### cd
|
|
364
|
|
365 <div style="text-align: center;">
|
|
366 <img src="figs/cd.svg" width="1200">
|
|
367 </div>
|
|
368
|
|
369 -->
|
19
|
370
|
|
371
|
|
372
|
|
373 </div>
|
|
374
|
|
375 <div class='slide'>
|
|
376 <!-- _S9SLIDE_ -->
|
46
|
377 <h2 id="gearsdirectoryの非破壊的編集による">GearsDirectoryの非破壊的編集による</h2>
|
35
|
378
|
|
379 <ul>
|
|
380 <li>GearsOSにおける永続データは非破壊的な編集を行う木構造を用いて保存する</li>
|
|
381 <li>ディレクトリシステム自体にバックアップの機能を搭載することが可能と考える</li>
|
|
382 </ul>
|
|
383
|
|
384 <div style="text-align: center;">
|
|
385 <img src="../paper/figs/nondestructive_tree_modification.png" width="1200" />
|
|
386 </div>
|
|
387
|
|
388
|
|
389
|
|
390 </div>
|
|
391
|
|
392 <div class='slide'>
|
|
393 <!-- _S9SLIDE_ -->
|
|
394 <h2 id="gearsfilesystemの今後">GearsFileSystemの今後</h2>
|
19
|
395
|
46
|
396 <h3 id="gearsdirectory-path">gearsDirectory path</h3>
|
35
|
397
|
|
398 <ul>
|
46
|
399 <li>gearsDirectoryにはpathの機能が実装されていない</li>
|
|
400 <li>full path指定のlsなどが実装できない状態である</li>
|
|
401 <li>FileSystemTreeを拡張し,ノードをたどりpathを生成する様な機能を実装する必要がある</li>
|
35
|
402 </ul>
|
|
403
|
|
404 <h3 id="gearsdirectory-filename">gearsDirectory filename</h3>
|
|
405
|
|
406 <ul>
|
|
407 <li>現状はgearsDirectoryのfilenameはIntegerの構造で管理されている</li>
|
|
408 <li>filenameは一般的に文字列型であるためIntegerから文字列型に変更する必要がある</li>
|
|
409 </ul>
|
|
410
|
|
411
|
|
412
|
|
413 </div>
|
|
414
|
|
415 <div class='slide'>
|
|
416 <!-- _S9SLIDE_ -->
|
|
417 <h2 id="gearsfilesystemの今後-1">GearsFileSystemの今後</h2>
|
|
418
|
46
|
419 <h3 id="gearsdirectory-on-disk">gearsDirectory on disk</h3>
|
35
|
420
|
|
421 <ul>
|
46
|
422 <li>現状はgearsDirectoryはon memoryで実装されている</li>
|
|
423 <li>inodeをdisk上に構築する必要がある</li>
|
|
424 </ul>
|
|
425
|
|
426 <h3 id="gearsshell">GearsShell</h3>
|
|
427
|
|
428 <ul>
|
|
429 <li>現状のGearsOSはユーザーの入力を受け付けることが出来ず,言語フレームワークの様に機能している</li>
|
|
430 <li>gearsFileSystemなどGearsOSの各機能と接続し,今回作成したcdやlsの様なコマンドを受け付けるGearsShellを作成したい</li>
|
35
|
431 </ul>
|
|
432
|
|
433 <h3 id="ファイルのバックアップ">ファイルのバックアップ</h3>
|
|
434
|
|
435 <ul>
|
|
436 <li>レコードのDataをファイルの差分履歴として保持し,日時情報を付け加えることでVersion Control Systemのような機能を持たせることが可能であると考えられる</li>
|
|
437 </ul>
|
|
438
|
|
439
|
|
440
|
|
441 </div>
|
|
442
|
|
443 <div class='slide'>
|
|
444 <!-- _S9SLIDE_ -->
|
46
|
445 <h2 id="gearsdirectoryまとめ">gearsDirectoryまとめ</h2>
|
35
|
446
|
|
447 <ul>
|
|
448 <li>gearsDirectoryの実装について説明した</li>
|
|
449 <li>RedBlackTreeのシンプルなinterfaceにより比較的容易に実装を行うことができた</li>
|
|
450 <li>形式手法とファイルシステムの機能の両面で信頼性の向上が図れると考える</li>
|
|
451 <li>RedBlackTreeを用いてinodeの仕組みを構築し,ls,cd,mkdirを作成するなどして,
|
46
|
452 Unix Likeに構築することが出来た</li>
|
35
|
453 </ul>
|
19
|
454
|
|
455 </div>
|
|
456
|
|
457
|
|
458 </div><!-- presentation -->
|
|
459 </body>
|
|
460 </html>
|