Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 71:d2aa3709bfc8
fix
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 04 Feb 2021 14:14:51 +0900 |
parents | 26c9cd7b9b21 |
children | 951cb9681030 |
files | paper/chapter/03-gears.tex paper/master_paper.pdf paper/master_paper.sty paper/master_paper.tex |
diffstat | 4 files changed, 47 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter/03-gears.tex Thu Feb 04 11:43:18 2021 +0900 +++ b/paper/chapter/03-gears.tex Thu Feb 04 14:14:51 2021 +0900 @@ -1,6 +1,6 @@ \chapter{GearsOS} -GearsOSとはContinuation Based Cを用いて実装しているOSプロジェクトである。\cite{gears} +GearsOSとはContinuation Based Cを用いて信頼性と拡張性の両立を目指して実装しているOSプロジェクトである。\cite{gears} CodeGearとDataGearを基本単位として実行する。 CodeGearを基本単位としているため、 各CodeGearは割り込みされず実行される必要がある。 割り込みを完全に制御することは一般的には不可能であるが、 GearsOSのメタ計算部分でこれを保証したい。 @@ -10,13 +10,15 @@ GearsOSはOSとして実行する側面と、 CbCのシンタックスを拡張した言語フレームワークとしての側面がある。 GearsOSはノーマルレベルとメタレベルの分離を目指して構築しているOSである。 すべてをプログラマが純粋なCbCで記述してしまうと、 メタレベルの情報を実装しなければならず、ノーマルレベルとメタレベルの分離をした意味がなくなってしまう。 -GesrsOSではユーザーが書いたノーマルレベルのコードの特定の記述や、シンタックスをもとに、メタレベルの情報を含む等価なCbCへと変換するシステムが含まれている。 +GesrsOSではユーザーが書いたノーマルレベルのコードの特定の記述や、シンタックスをもとに、メタレベルの情報を含む等価なCbCへとコンパイル時にコードを変換する。 +コード変換はPerlスクリプトで行われている。 現在のGearsOSはUnixシステム上のアプリケーションとして実装されているものと、 xv6の置き換えとして実装されているもの\cite{weko_195888_1}がある。 \section{GearsOSの構成} GearsOSは様々な役割を持つCodeGearとDataGearで構成されている。 +またCodeGearとDataGearのモジュール化の仕組みとしてInterfaceが導入されている。 GearsOSの構成図を図\ref{fig:gearsstruct}に示す。 中心となるMetaDataGearは以下の要素である。 @@ -38,19 +40,11 @@ \section{Context} Contextとは従来のOSのプロセスに相当する概念である。 GearsOSでのデータの単位から見ると、 MetaDataGearに相当する。 -Contextの概要図を図\ref{fig:context}に示す。 +Contextの概要図を図\ref{fig:context}に、実際のCbC上での定義をソースコード\ref{src:structContext}に示す。 ContextはMetaDataGearである為に、 ノーマルレベルのCodeGearからはcontextは直接参照しない。 contextの操作をしてしまうと、メタレベルとノーマルレベルの分離をした意味がなくなってしまう為である。 -\begin{figure}[h] - \begin{center} - \includegraphics[width=120mm]{drawio/context.pdf} - \end{center} - \caption{Contextの概要図} - \label{fig:context} - \end{figure} - Contextはプロセスに相当するので、ユーザープログラムごとにCotnextが存在する。 このContextをUser Contextと呼ぶ。 さらに実行しているGPUやCPUごとにContextが必要となる。 @@ -61,15 +55,25 @@ OSが持たなければならない割り込みのフラグなどはKContextに置かれている。 GearsOSのメタレベルのプログラミングでは、 今処理をしているContextが誰のContextであるかを強く意識する必要がある。 +\lstinputlisting[label=src:structContext, caption=contextの定義]{src/structContext.h} +\begin{figure}[t] + \begin{center} + \includegraphics[width=120mm]{drawio/context.pdf} + \end{center} + \caption{Contextの概要図} + \label{fig:context} + \end{figure} ContextはGearsOSの計算で使用されるすべてのDataGearとCodeGearを持つ。 つまりGearsOSで使われるCodeGearとDataGearは、 誰かのContextに必ず書き込まれている。 各CodeGear、DataGearはContextはそれぞれ配列形式でContextにデータを格納する場所が用意されている。 -CodeGearが保存されている配列は\texttt{context->code}である。 +CodeGearが保存されている配列はソースコード\ref{src:structContext}の6行目で定義している\texttt{code}である。 +StubCodeGearはContextのみを引数で持つため、 \texttt{\_\_code stub(struct Context*)}の様なCodeGearの関数ポインタのポインタ、つまりCodeGearの配列としての定義されている。 これは前述したStubCodeGearの関数ポインタが格納されており、 \texttt{\_\_code meta}でのディスパッチに利用される。 -DataGearが保存されている配列は\texttt{context->data}である 。 +DataGearが保存されている配列は7行目で定義している\texttt{data}である 。 +すべてのDataGearはGearsOS上では\texttt{union Data}型として取り扱えるので、 \texttt{union Data}のポインタの配列として宣言されている。 ただしGearsOSで使うすべてのDataGearがこのContextに保存されている訳ではない。 Interfaceを利用したgoto時の値の保存場所として、この配列にDataGearごと割り振られた場所にDtaGearを保存する用途で利用している。 CodeGearで利用している配列と同様に、 この配列の添え字もDataGearの番号に対応している。 @@ -78,20 +82,35 @@ DataGearは配列形式のデータ格納場所のほかに、Contextが持つヒープに保存することも可能である。 計算で必要なDataGearは、 CbCの中でアロケーションした場合はContextにヒープに書き込まれる。 ヒープにはDataGearと、書き込んだDataGearのメタ情報が記載されているMetaDataGearで構成されている。 +\section{Stub Code Gear} +次のCodeGearに継続する際、ノーマルレベルから見ると次のCodeGearを直接指定しているように見える。 +さらに次のCodeGearに引数などを直接渡しているようにも見える。 +しかしノーマルレベルから次のCodeGearに継続する場合は関数ポインタなどが必要になるが、 これらはメタ計算に含まれる。 +その為純粋にノーマルレベルからCodeGear間を自由に継続させてしまうと、 ノーマルレベルとメタレベルの分離ができなくなってしまう。 +ノーマルレベルとメタレベルの分離の為に、 次のCodeGearには直接継続させず、間にMetaCodeGearをはさむようにする必要がある。 +CodeGear間の継続はGearsOSのビルド時にPerlスクリプトによって書き換えが行われ、MetaCodeGearを経由するように変更される。 + +GearsOSではDataGearはすべてContextを経由してやり取りをする。 +次の継続にDataGearを渡す場合、 継続する前に一度ContextにDataGearを書き込み、 継続先でContextからDataGearを取り出す。 +ContextはMetaDataGearであるために、 ノーマルレベルのCodeGearではなくMetaCodeGearで扱う必要がある。 +各CodeGearの計算で必要なDataGearをContextから取り出すMetaCodeGearは、 実行したいCodeGearの直前で実行される必要がある。 +このCodeGearを特にStubCodeGearと呼ぶ。 +StubCodeGearはすべてのCodeGearに対して実装しなければならず、 手で実装するのは煩雑である。 +StubCodeGearもGearsOSのビルド時にPerlスクリプトによって自動生成される。 + +ソースコード\ref{src:StackPush}に示すノーマルレベルで記述したCodeGearを、Perlスクリプトによって変換した結果をソースコード\ref{src:StackPushStub}に示す。 +常に自分自身のContextをCodeGearは入力の形で受け取る為、変換後の\texttt{pushSingleLinkedStack}は、 第1引数にContextが加わっている。 +pushSingleLinkedStackは引数は3つ要求していた。 +これらの引数は生成された\texttt{pushSingleLinkedStack\_stub}がContextの特定の場所から取り出す。 +このCodeGearはGearsOSのInterfaceを利用しており、 Stack Interaceの実装となっている。 +マクロ\texttt{Gearef}は、 contextのInterface用のDataGearの置き場所にアクセスするマクロであり、 Stack Interfaceの置き場所から、引数情報を取得している。 +すべての引数を取得したのちに、\texttt{goto pushSingleLinkedStack}で、CodeGearに継続する。 +\lstinputlisting[label=src:StackPush, caption=StackにPushするCodeGear]{src/StackPush.cbc} +\lstinputlisting[label=src:StackPushStub, caption=\ref{src:StackPush}のStubCodeGear]{src/StackPush.c} -\section{Stub Code Gear} - -次のCodeGearに継続する際、ノーマルレベルから見ると次のCodeGearを直接指定しているように見える。 -GearsOSではCodeGearの入力は、 メタレベルから見るとContextのみである。 -ノーマルレベルでは次のCodeGearに引数を渡しているが、 実際は素直に引数を渡せず、 使用するDataGearはContextから取得しなければならない。 -これらの処理はメタ計算である。 -GearsOSではメタ計算はMetaCodeGearが行っていた。 -必ずメタ計算を実行しなければならないので、 CodeGearは直接次のCodeGearに継続するのではなく、 特定のMetaCodeGearに一度継続する。 -ContextからのDataGearの取得は、StubCodeGearと呼ばれるMetaCodeGearが実行する。 Contextと継続の関係性を図\ref{fig:stubCodeGear}に示す。 StubCodeGearはGearsOSで定義されているノーマルレベルのCodeGearのすべてに生成される。 -ユーザーが記述したノーマルレベルのCodeGearへのgoto文は、 GearsOSのビルド時にPerlスクリプトによってMetaCodeGearへ継続するように書き換えられる。 \begin{figure}[h] \begin{center} @@ -102,7 +121,6 @@ \end{figure} -StubCodeGearへの継続は、 CodeGearの処理が実行した後に継続されるCodeGearである\texttt{\_\_code meta}が行う。 \texttt{\_\_code meta}の定義をソースコード\ref{src:meta}に示す。 \texttt{\_\_code meta}はContextに格納されているCodeGearの配列からCodeGearのアドレスを取得し継続する。 この際に配列の要素を特定する際に使われる添え字は、 各CodeGearに割り振られた番号を利用している。 @@ -154,7 +172,7 @@ このためenumで指定した場所に入っているunion Dataの具体的な型は、 enumと対応するDataGearになる。 contextのヒープにアロケートされたDataGearの場合は、 型情報を取得できるMetaDataGearにアクセスすると、なんの型であったかが分かる。 -union DataからDataGearの型への変換はメタ計算で行われる。 +Contextから取り出してきたunion DataからDataGearの型への変換はメタ計算で行われる。 GearsOSの場合は、計算したいCodeGearの直前で実行されるStubCodeGearで値のキャストが行われる。 \section{GearsOSのビルドシステム} GearsOSではビルドツールにCMakeを利用している。
--- a/paper/master_paper.sty Thu Feb 04 11:43:18 2021 +0900 +++ b/paper/master_paper.sty Thu Feb 04 14:14:51 2021 +0900 @@ -192,7 +192,9 @@ } \newcommand{\makecommission} { - \null + \noindent + 論文題目: GearsOSのメタ計算 \newline\newline + 氏\hspace{4ex}名: 清水 隆博 \vspace*{4.5cm} \begin{center} 本論文は、修士(工学)の学位論文として適切であると認める。