# HG changeset patch # User anatofuz # Date 1588663058 -32400 # Node ID c2ba9cdb49161f288aef2afbf2cfd6c4e0aa4581 # Parent ff9dec2d1c1a72900b4e219fcff1fdd77e7002cd ... diff -r ff9dec2d1c1a -r c2ba9cdb4916 paper/anatofuz-sigos.md --- a/paper/anatofuz-sigos.md Tue May 05 15:06:56 2020 +0900 +++ b/paper/anatofuz-sigos.md Tue May 05 16:17:38 2020 +0900 @@ -159,16 +159,33 @@ # xv6のシステムコール以外の継続の分析 xv6はシステムコール以外に、 ファイルシステムの操作やページテーブルの管理などの処理も存在している。 これらはOSの立ち上げ時やシステムコールの中で、ファイルシステムの操作に対応した関数や構造体などのAPIを通して操作される。 +システムコールの一連の流れに着目するのではなく、 特定の対象のAPIに着目して継続の分析を検討した。 + +xv6のファイルシステムに関する定義ファイルは`fs.c`中に記述されている。 +Code\ref{src:fs_interface}に示す様に、 `fs.c`中に定義されているAPIを抜き出し、 CbCのInterfaceとして定義した。 +`__code`から始まるCodeGearの名前が、 それぞれ抽象化されたCodeGearの集合への名前となる。 + + +``` lab:src:fs_interface, cap:ファイルシステム操作のAPIの一部 +typedef struct fs { + __code readsb(Impl* fs, uint dev, struct superblock* sb, __code next(...)); + __code iinit(Impl* fs, __code next(...)); + __code ialloc(Impl* fs, uint dev, short type, __code next(...)); + __code iupdate(Impl* fs, struct inode* ip, __code next(...)); + __code idup(Impl* fs, struct inode* ip, __code next(...)); + __code ilock(Impl* fs, struct inode* ip, __code next(...)); + __code iunlock(Impl* fs, struct inode* ip, __code next(...)); + __code iput(Impl* fs, struct inode* ip, __code next(...)); +.... +} fs; +``` + # Basic Blockに基づく分析 -xv6のファイルシステムに関する定義ファイルはfs.c中に記述されている。 -この中に出てくる関数に着目し、 この関数をさらにCodeGearに変換していくことで状態遷移単位での記述を試みた。 - まず関数内でif文などの分岐を持たない基本単位であるBasic Blockに着目した。 CbCのCodeGearの粒度はCの関数とアセンブラの中間であるといえるので、 BasicBlockをCodeGearに置き換える事が可能である。 -したがって特定の関数内の処理のBasicBlockを分析し、 BasicBlockに対応したCodeGearへ変換することで状態遷移系への変換を行った。 - +したがって特定の関数内の処理のBasicBlockを分析し、 BasicBlockに対応したCodeGearへ変換することが可能となる。 # CbCを用いた部分的なxv6の書き換え diff -r ff9dec2d1c1a -r c2ba9cdb4916 paper/anatofuz-sigos.pdf Binary file paper/anatofuz-sigos.pdf has changed diff -r ff9dec2d1c1a -r c2ba9cdb4916 paper/anatofuz-sigos.tex --- a/paper/anatofuz-sigos.tex Tue May 05 15:06:56 2020 +0900 +++ b/paper/anatofuz-sigos.tex Tue May 05 16:17:38 2020 +0900 @@ -265,16 +265,33 @@ \section{xv6のシステムコール以外の継続の分析} xv6はシステムコール以外に、 ファイルシステムの操作やページテーブルの管理などの処理も存在している。 これらはOSの立ち上げ時やシステムコールの中で、ファイルシステムの操作に対応した関数や構造体などのAPIを通して操作される。 +システムコールの一連の流れに着目するのではなく、 特定の対象のAPIに着目して継続の分析を検討した。 + +xv6のファイルシステムに関する定義ファイルは`fs.c`中に記述されている。 +Code\ref{src:fs_interface}に示す様に、 `fs.c`中に定義されているAPIを抜き出し、 CbCのInterfaceとして定義した。 +\texttt{\_\_code}から始まるCodeGearの名前が、 それぞれ抽象化されたCodeGearの集合への名前となる。 + + +\begin{lstlisting}[frame=lrbt,label=src:fs_interface,caption={ファイルシステム操作のAPIの一部}] +typedef struct fs { + __code readsb(Impl* fs, uint dev, struct superblock* sb, __code next(...)); + __code iinit(Impl* fs, __code next(...)); + __code ialloc(Impl* fs, uint dev, short type, __code next(...)); + __code iupdate(Impl* fs, struct inode* ip, __code next(...)); + __code idup(Impl* fs, struct inode* ip, __code next(...)); + __code ilock(Impl* fs, struct inode* ip, __code next(...)); + __code iunlock(Impl* fs, struct inode* ip, __code next(...)); + __code iput(Impl* fs, struct inode* ip, __code next(...)); +.... +} fs; +\end{lstlisting} + \section{Basic Blockに基づく分析} -xv6のファイルシステムに関する定義ファイルはfs.c中に記述されている。 -この中に出てくる関数に着目し、 この関数をさらにCodeGearに変換していくことで状態遷移単位での記述を試みた。 - まず関数内でif文などの分岐を持たない基本単位であるBasic Blockに着目した。 CbCのCodeGearの粒度はCの関数とアセンブラの中間であるといえるので、 BasicBlockをCodeGearに置き換える事が可能である。 -したがって特定の関数内の処理のBasicBlockを分析し、 BasicBlockに対応したCodeGearへ変換することで状態遷移系への変換を行った。 - +したがって特定の関数内の処理のBasicBlockを分析し、 BasicBlockに対応したCodeGearへ変換することが可能となる。 \section{CbCを用いた部分的なxv6の書き換え}