6
|
1 \chapter{CbC による Geas OS の開発}
|
|
2 信頼性の保証と並列実行のサポートを目的として、 本研究室では CbC というプログラミング言語を開発してきた。
|
|
3 さらにその CbC を使って Gears OS を開発している。
|
5
|
4 従来の OS が行うメモリ管理並列実行は Meta レベル(kernel space)で処理される。
|
|
5 ノーマルレベルからメタレベルの記述ができる GearsOS を開発している。
|
3
|
6
|
|
7 \section{Code Gear と Data Gear}
|
5
|
8 Gears OS は Code Gear と Data Gear という単位でプログラムを記述する CbC を用いて実装する。
|
|
9 Code Gear は CbC における最も基本的な処理の単位である。
|
|
10 Code Gear 間で入力(Input Data Gear)と出力(Output Data Gear)を持ち、goto によって Code Gear から次の Code Gear へ遷移し、継続的に処理を行う。
|
17
|
11 関数呼び出しとは異なり、呼び出し元には戻らない。
|
5
|
12 Code Gear 間の処理の流れを図 \ref{fig:codegear} に示す。
|
3
|
13
|
|
14
|
5
|
15 % 状態遷移ベースのプログラミング言語である。
|
3
|
16 % (継続的に処理を行う)ことで検証を容易に余す所なく行うことができる.
|
|
17 \begin{figure}[ht]
|
|
18 \begin{center}
|
|
19 \includegraphics[width=160mm]{./fig/codegear}
|
|
20 \end{center}
|
|
21 \caption{Code Gear 間の継続}
|
|
22 \label{fig:codegear}
|
|
23 \end{figure}
|
|
24
|
|
25
|
5
|
26 Data Gear は CbC におけるデータの基本的な単位である。Input Data Gear と Output Data Gear があり、Code Gear の遷移の際に Input Data Gear を受け取り、Output Data Gear を書き出す。
|
3
|
27
|
|
28
|
|
29 \section{Meta Code Gear と Meta Data Gear}
|
5
|
30 CbC ではノーマルレベルの記述と別にメタレベルで記述することができる。メタレベルの記述によって User Space 側からメモリ管理を行えるようになる。
|
13
|
31
|
|
32
|
17
|
33 メタ計算は Meta Code Gear と Meta Data Gear を用いる。
|
|
34 この2つはノーマルレベルからメタレベルの変換する時に使われる。
|
|
35 メタレベルの変換は Perl スクリプトで実装している。
|
|
36 Gears OS での Meta Code Gear は Code Gear の直前、 直後に挿入され、メタ計算を実行する。
|
|
37 それぞれの Code Gear, Meta Code Gear の継続には入力される Data Gear(Input Data Gear) と出力されるData Gear(Output Data Gear)が存在する。
|
5
|
38 Code Gear 間の継続はノーマルレベルでは 図 \ref{fig:codegear} のように見えるが、メタレベルでの Code Gear は図 \ref{fig:meta_cg_dg} の下のように継続を行っている。
|
|
39
|
3
|
40
|
|
41 \begin{figure}[ht]
|
|
42 \begin{center}
|
17
|
43 \includegraphics[width=160mm]{./fig/Meta_Code_Gear}
|
3
|
44 \end{center}
|
|
45 \caption{ノーマルレベルとメタレベルの継続の見え方}
|
|
46 \label{fig:meta_cg_dg}
|
|
47 \end{figure}
|
|
48
|
|
49
|
4
|
50 \section{Context}
|
5
|
51 Gears OS の Context は Meta Data Gear であり、接続可能な Code Gear と Data Gear のリスト、 Data Gear を確保するメモリ空間などを持っている。
|
|
52 従来のスレッドやプロセスに対応する。Gears OS では Code Gear と Data Gear への接続を Context を通して行う。Context が持つ Data Gear のメモリ空間は事前に確保され、Data Gear のメモリ確保の際に heap の値をずらしてメモリを割り当てる。
|
4
|
53 % パルスさん3.1
|
13
|
54
|
|
55
|
5
|
56 ノーマルレベルの Code Gaer から Meta Data Gear である Context を直接参照してしまうと、ユーザーがメタ計算をノーマルレベルで自由に記述できてしまい、メタ計算を分離した意味がなくなってしまう。
|
|
57 この問題を防ぐため、Context から必要な Data Gear のみをノーマルレベルの Code Gear に渡す処理を行なっている。
|
13
|
58
|
|
59
|
5
|
60 Meta Code Gear は使用される全ての Code Gear ごとに記述する必要がある。しかし、全ての Code Gear に対して記述すると膨大な記述量になる。そのため、Interface を実装した code Gear の Meta Code Gear は Perl スクリプトで自動生成する。
|
13
|
61
|
|
62
|
5
|
63 Meta Code Gear はユーザーが記述することも可能である。そうすることでメタ計算を記述することができるようになったり、goto による継続先を変更することで Geas OS の機能を置き換えることができる。
|
4
|
64
|
|
65
|
14
|
66 第5章で扱うメモリ管理部分である vm の Context を ソースコード \ref{contexth} に示す。
|
|
67
|
|
68 \lstinputlisting[label=contexth, caption={\footnotesize 生成された Context}]{./src/context.h}
|
4
|
69
|
14
|
70 % code は全ての Code Gear を列挙した enum と関数ポインタの組みで表現される。(ソースコード \ref{contexth} 55行目~68行目)
|
|
71 Code Gear の名前は enum で定義され、コンパイル後には整数で変換される。
|
|
72 Code Gear に接続する際は enum で定義された番号を指定する。
|
|
73 これによってメタ計算時に接続する Code Gear を切り替えることができる。
|
5
|
74
|
|
75
|
14
|
76 Data Gear のメモリ空間は事前に領域を確保した後、必要に応じて領域を割り当てることで実現する。
|
|
77 実際に Allocation する際は ソースコード \ref{contexth} 9行目で定義した heap を Data Gear のサイズ分増やすことで実現する。
|
|
78
|
|
79
|