Mercurial > hg > Papers > 2019 > mitsuki-master
changeset 38:1d8c163b7255
update
author | mir3636 |
---|---|
date | Thu, 07 Feb 2019 17:03:06 +0900 |
parents | ae5601060567 |
children | e457f4bc2a74 |
files | paper/fig/Interface.graffle paper/fig/Interface.pdf paper/fig/Interface.xbb paper/interface.tex paper/master_paper.pdf paper/meta_computation.tex paper/xv6.tex |
diffstat | 7 files changed, 69 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/fig/Interface.xbb Thu Feb 07 17:03:06 2019 +0900 @@ -0,0 +1,8 @@ +%%Title: fig/Interface.pdf +%%Creator: extractbb 20160307 +%%BoundingBox: 0 0 288 421 +%%HiResBoundingBox: 0.000000 0.000000 288.000000 421.000000 +%%PDFVersion: 1.4 +%%Pages: 1 +%%CreationDate: Thu Feb 7 14:56:37 2019 +
--- a/paper/interface.tex Thu Feb 07 11:40:31 2019 +0900 +++ b/paper/interface.tex Thu Feb 07 17:03:06 2019 +0900 @@ -2,6 +2,16 @@ Interface は Gears OS のモジュール化の仕組みである。 Interface は呼び出しの引数になる Data Gear の集合であり、そこで呼び出される Code Gear のエントリである。 呼び出される Code Gear の引数となる Data Gear はここで全て定義される。 +Interface を定義することで複数の実装を持つことができる。 +図 \ref{fig:Interface} は Stack の Interface とその実装を表したものである。 + +\begin{figure}[ht] + \begin{center} + \includegraphics[width=60mm]{fig/Interface.pdf} + \end{center} + \caption{Stack の Interface とその実装} + \label{fig:Interface} +\end{figure} Data Gear は、ノーマルレベルとメタレベルで見え方が異なる。 ノーマルレベルの Code Gear では Data Gear の引数に見える。 @@ -67,13 +77,27 @@ \section{Interface の実装} ソースコード\ref{implement}は Stack の実装の例である。 -create の関数は 実装の初期化である。 -ソースコード\ref{implement}、6〜12行目で実装の Code Gear に代入しているものは Context が -持つ enum で定義された Code Gear の番号である。 -ソースコード \ref{Gears_code}、3行目で stack\verb|->|pop へと goto しているが、 +createImpl は実装の初期化を行う関数である。 +Interface の実装を呼び出す際、この関数を呼び出すことで ソースコード\ref{pushStack} 4 行目のように実装の操作を呼び出せるようになる。 +ソースコード\ref{implement} 2 行目は操作する Stack のデータ構造の確保をしている。 +SingleLinkedStack のデータ構造は ソースコード \ref{SingleLinkedStack} である。 +ソースコード\ref{implement} 6〜12行目で実装の Code Gear に代入しているものは Context が持つ +enum で定義された Code Gear の番号である。 +ソースコード \ref{Gears_code} 3行目で stack\verb|->|pop へと goto しているが、 stack\verb|->|pop には Code Gear の番号が入っているため実装した Code Gear へと継続する。 このため、ソースコード \ref{Gears_code} では 6行目の popSingleLinkedStack へと継続している。 \lstinputlisting[label=implement, caption=SingleLinkedStackの実装]{./src/stackimpl.cbc} +\begin{lstlisting}[frame=lrbt,label=SingleLinkedStack,caption={SingleLinkedStack のデータ構造}] + struct SingleLinkedStack { + struct Element* top; + } SingleLinkedStack; + struct Element { + union Data* data; + struct Element* next; + } Element; +\end{lstlisting} + +
--- a/paper/meta_computation.tex Thu Feb 07 11:40:31 2019 +0900 +++ b/paper/meta_computation.tex Thu Feb 07 17:03:06 2019 +0900 @@ -5,7 +5,7 @@ 従来の OS では、メタ計算はシステムコールやライブラリーコールの単位で行われる。 実行時にメタ計算の変更を行う場合には、OS 内部のパラメータの変更を使用し、 実行されるユーザープログラム自体への変更は限定的である。 -しかし、メタ計算は性能測定あるいはプログラム検証、さらに並列分散計算のチューニングなど細かい処理が必要で +しかし、メタ計算は性能測定、あるいはプログラム検証、さらに並列分散計算のチューニングなど細かい処理が必要で 実際のシステムコール単位では不十分である。 例えば、モデル検査ではアセンブラあるいはバイトコード、インタプリタレベルでのメタ計算が必要になる。 しかし、バイトコードレベルでは粒度が細かすぎて扱いが困難になっている。 @@ -84,8 +84,8 @@ \end{figure} ソースコード \ref{Gears_code} は Gears OS での Stack の pop 操作の Code Gear の例である。 -popSingleLinkedStack での引数 stack が Input Data Gear、next は継続先の Code Gear のアドレス、 -next の引数の data が Output Data Gear、... は可変長引数であることを示している。 +popSingleLinkedStack での引数 stack が Input Data Gear、next は継続先の Code Gear を示す。 +また、next の引数の data が Output Data Gear、... は可変長引数であることを示している。 Input Data Gear で受け取った Stack に対して pop の操作を行った後に、 取り出したデータを Output Data Gear として書き出し、goto next で引数で受けた次の Code Gear へと継続する。 @@ -119,13 +119,14 @@ この2つのレベルはプログラミング言語レベルでの変換として実現される。 メタレベルでの変換系は本論文では、Perl による変換スクリプトにより実装されている。 -Meta Code Gear は通常の Code Gear の直前、直後に遷移され、メタ計算を実行する。 -Code Gear はノーマルレベルでは図 \ref{fig:normal_Code_Gear} のように見える。 +Gears OS では、Meta Code Gear は通常の Code Gear の直前、直後に挿入され、メタ計算を実行する。 +Code Gear 間の継続はノーマルレベルでは図 \ref{fig:normal_Code_Gear} のように見える。 メタレベルでは Code Gear は図 \ref{fig:meta_Code_Gear} のように継続を行なっている。 + \begin{figure}[ht] \begin{center} - \includegraphics[width=60mm]{fig/normal_Code_Gear.pdf} + \includegraphics[width=70mm]{fig/normal_Code_Gear.pdf} \end{center} \caption{ノーマルレベルの Code Gear の継続} \label{fig:normal_Code_Gear} @@ -133,7 +134,7 @@ \begin{figure}[ht] \begin{center} - \includegraphics[width=100mm]{fig/meta_Code_Gear.pdf} + \includegraphics[width=140mm]{fig/meta_Code_Gear.pdf} \end{center} \caption{メタレベルの Code Gear の継続} \label{fig:meta_Code_Gear} @@ -164,6 +165,19 @@ \label{fig:Context_ref} \end{figure} +次の Code Gear に継続する際にもメタレベルでは Meta Code Gear が挟まれる。 +ノーマルレベルでは goto codeGear() で次の Code Gear の継続を記述するので、直接 Code Gear へ継続するように見えるが、 +実際には \_\_code meta へと継続している。 +\_\_code meta では Context の持つ Code Gear のリストから目的の Code Gear へと継続している。(ソースコード \ref{codemeta}) + +\begin{lstlisting}[frame=lrbt,label=codemeta,caption={\footnotesize code meta}] + +__code meta(struct Context* context, enum Code next) { + goto (context->code[next])(context); +} + +\end{lstlisting} + Code Gear と Data Gear は Interface と呼ばれるまとまりとして記述される。 Interface は使用される全ての Data Gear の定義と、それに対する操作を行う Code Gear の集合である。 Interface 作成時に Code Gear の集合を指定することにより複数の実装を持つことができる。
--- a/paper/xv6.tex Thu Feb 07 11:40:31 2019 +0900 +++ b/paper/xv6.tex Thu Feb 07 17:03:06 2019 +0900 @@ -146,6 +146,8 @@ 継続で Code Gear 間を遷移するため関数呼び出しとは違い元の関数には戻ってこない。 このため、書き換えの際には ソースコード \ref{fileread} のように分割する必要がある。 +プロセスの状態を持つ struct proc は大域変数であるため Code Gear を用いるために必要なパラメーターを cbc\_arg として持たせることにした。 +継続を行う際には必要なパラメーターをここに格納する。 \begin{lstlisting}[frame=lrbt,label=fileread,caption={\footnotesize fileread の CbC 書き換えの例}] __code cbc_fileread1 (int r) @@ -206,3 +208,13 @@ panic("fileread"); } \end{lstlisting} + +xv6 のシステムコールの関数を CbC で書き換え、QEMU 上で動作させることができた。 + +\section{xv6 のモジュール化} + +xv6 全体を CbC で書き換えるためには Interface を用いてモジュール化する必要がある。 +xv6 をモジュール化し、CbC で書き換えることができれば、Gears OS の機能を置き換えることもできる。 +図 \ref{fig:xv6Interface} では Interface を用いた xv6 の構成図となる。 + +