Mercurial > hg > Papers > 2019 > mitsuki-master
changeset 55:1e1804a9269a
update
author | mir3636 |
---|---|
date | Tue, 12 Feb 2019 08:05:32 +0900 |
parents | cf325c78edc1 |
children | a75b7b214f13 |
files | paper/evaluation.tex paper/generate_code.tex paper/master_paper.pdf |
diffstat | 3 files changed, 42 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/evaluation.tex Tue Feb 12 07:20:51 2019 +0900 +++ b/paper/evaluation.tex Tue Feb 12 08:05:32 2019 +0900 @@ -75,4 +75,40 @@ また、stub Code Gear は Code Gear 毎に挿入されるため、 これが自動生成されることによってソースコードの記述量が大幅に減少した。 +\section{xv6 の CbC 書き換えのための環境構築} +xv6-rpi の CbC 書き換えを行うために、ARM 用のクロスコンパイラを build する必要があった。 +しかし、LLVM 上で実装した CbC では上手くいかなかったため、GCC 上で実装した CbC を用いることにした。 +GCC 上で実装した CbC は更新が止まっていたため、現在の GCC へのアップデート作業を行なった。 +これにより、GCC 上で実装された CbC が、最新の環境で動作するようになり、 +ARM 用のクロスコンパイラの build も可能となった。 + +\section{xv6 の CbC 書き換え} + +CbC は Code Gear 間の遷移は goto による継続で行われるため、 +状態遷移ベースでのプログラムに適している。 +xv6 を CbC で書き換えることにより、実行可能な OS のプログラムを状態遷移モデルに落とし込むことができる。 +これにより状態遷移系のモデル検査が可能となる。 + +xv6 のシステムコールを CbC によって書き換えることで、 +元の C のソースコードからの大きな変更をすることなしに、 +図 \ref{fig:state} のように状態遷移ベースの実行可能なプログラムへと落とし込むことができた。 + +\begin{figure}[ht] + \begin{center} + \includegraphics[width=150mm]{fig/state.pdf} + \end{center} + \caption{read システムコールの遷移図} + \label{fig:state} +\end{figure} + +また、CbC は C 言語との互換があるため、システムコールのみ CbC へと書き換えるといったことも可能であるため、 +信頼性を保証したい機能のみを CbC で記述することもできる。 + +さらに、CbC は Agda に変換できるように設計されているため CbC で記述された実行可能なプログラムが、 +そのまま Agda による定理証明が可能となる。 + +これらのため、CbC で記述された実行可能な OS そのものがモデル検査と定理証明が可能となり、 +OS の信頼性が保証できる。 + +
--- a/paper/generate_code.tex Tue Feb 12 07:20:51 2019 +0900 +++ b/paper/generate_code.tex Tue Feb 12 08:05:32 2019 +0900 @@ -64,6 +64,7 @@ 生成された stub Code Gear は、 継続先の Code Gear が引数で指定した Input Data Gear、Output Data Gear を Context から参照している。 Gearef は Context から Data Gear を参照するためのマクロである。 +ソースコード\ref{macro} 1行目が Gearef マクロの定義である。 ソースコード\ref{noref} はマクロを用いなかった場合の pop stack の stub Code Gear である。 Context には Allocation 等で生成した Data Gear へのポインタが格納されている。 Code Gear が Context にアクセスする際、 @@ -74,10 +75,14 @@ GearImpl マクロは Interface の型に包まれた Data Gear から 実装の Data Gear を取り出すためのマクロである。 +ソースコード\ref{macro} 2行目が GearImpl マクロの定義である。 実装の Data Gear を取り出す際も、ポインタでの記述が複雑になってしまうため 同様に GearImpl を定義した。 GearImpl は Context と Interface の型、実装の Data Gear 名を指定することで参照する。 -% 変換前のコードも入れる +\begin{lstlisting}[frame=lrbt,label=macro,caption={Gearef、GearImpl}] +#define Gearef(context, t) (&(context)->data[D_##t]->t) +#define GearImpl(context, intf, name) (Gearef(context, intf)->name->intf.name) +\end{lstlisting} \begin{lstlisting}[frame=lrbt,label=noref,caption={マクロを用いない stub Code Gear}] __code popSingleLinkedStack_stub(struct Context* context) {