comparison paper/anatofuz-sigos.tex @ 39:228d350be33e

update tex
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Wed, 06 May 2020 13:34:53 +0900
parents 9e40a7a00a02
children a91592fafeb1
comparison
equal deleted inserted replaced
38:32453ef823d9 39:228d350be33e
265 \section{xv6のシステムコール以外の継続の分析} 265 \section{xv6のシステムコール以外の継続の分析}
266 xv6はシステムコール以外に、 ファイルシステムの操作やページテーブルの管理などの処理も存在している。 266 xv6はシステムコール以外に、 ファイルシステムの操作やページテーブルの管理などの処理も存在している。
267 これらはOSの立ち上げ時やシステムコールの中で、ファイルシステムの操作に対応した関数や構造体などのAPIを通して操作される。 267 これらはOSの立ち上げ時やシステムコールの中で、ファイルシステムの操作に対応した関数や構造体などのAPIを通して操作される。
268 システムコールの一連の流れに着目するのではなく、 特定の対象のAPIに着目して継続の分析を検討した。 268 システムコールの一連の流れに着目するのではなく、 特定の対象のAPIに着目して継続の分析を検討した。
269 269
270 xv6のファイルシステムに関する定義ファイルは\texttt{fs.c}中に記述されている。 270 xv6のファイルシステムに関する関数などのAPIは主に\texttt{fs.c}中に記述されている。
271 Code\ref{src:fs_interface}に示す様に、 \texttt{fs.c}中に定義されているAPIを抜き出し、 CbCのInterfaceとして定義した。 271 Code\ref{src:fs_interface}に示す様に、 \texttt{fs.c}中に定義されているAPIを抜き出し、 CbCのInterfaceとして定義した。
272 \texttt{\_\_code}から始まるCodeGearの名前が、 それぞれ抽象化されたCodeGearの集合の最初の継続となる。 272 \texttt{\_\_code}から始まるCodeGearの名前が、 それぞれ抽象化されたCodeGearの集合の最初の継続となる。
273 273
274 274
275 \begin{lstlisting}[frame=lrbt,label=src:fs_interface,caption={ファイルシステム操作のAPIの一部}] 275 \begin{lstlisting}[frame=lrbt,label=src:fs_interface,caption={ファイルシステム操作のAPIの一部}]
289 Code\ref{src:fs_interface}内の \texttt{readsb}などは\texttt{fs.c}内で定義されているCの関数名と対応している。 289 Code\ref{src:fs_interface}内の \texttt{readsb}などは\texttt{fs.c}内で定義されているCの関数名と対応している。
290 このCの関数を更に継続ごと分割するために、 関数内のif文などの分岐を持たない基本単位であるBasic Blockに着目した。 290 このCの関数を更に継続ごと分割するために、 関数内のif文などの分岐を持たない基本単位であるBasic Blockに着目した。
291 291
292 CbCのCodeGearの粒度はCの関数とアセンブラの中間であるといえるので、 BasicBlockをCodeGearに置き換える事が可能である。 292 CbCのCodeGearの粒度はCの関数とアセンブラの中間であるといえるので、 BasicBlockをCodeGearに置き換える事が可能である。
293 したがって特定の関数内の処理のBasicBlockを分析し、 BasicBlockに対応したCodeGearへ変換することが可能となる。 293 したがって特定の関数内の処理のBasicBlockを分析し、 BasicBlockに対応したCodeGearへ変換することが可能となる。
294 実際にBasicBlock単位で切り分ける前の処理と、切り分けたあとの処理を示す。 294 実際にBasicBlock単位で切り分ける前の処理と、切り分けたあとの処理の一部を示す。
295 295 例としてinodeのアロケーションを行うAPIでる\texttt{ialloc}の元のコードをCode\ref{src:ialloc_origin}に示す。
296
297 \begin{lstlisting}[frame=lrbt,label=src:ialloc_origin,caption={iallocの元のソースコード}]
298 struct inode* ialloc (uint dev, short type)
299 {
300 readsb(dev, &sb);
301 for (inum = 1; inum < sb.ninodes; inum++) {
302 bp = bread(dev, IBLOCK(inum));
303 dip = (struct dinode*) bp->data + inum % IPB;
304
305 if (dip->type == 0) { // a free inode
306 memset(dip, 0, sizeof(*dip));
307 // omission
308 return iget(dev, inum);
309 }
310 brelse(bp);
311 }
312 panic("ialloc: no inodes");
313 }
314 \end{lstlisting}
315
316 \texttt{ialloc}はループ条件である \texttt{inum < sb.ninodes}が成立しなかった場合は\texttt{panic}へと状態が遷移する。
317 この\texttt{for}文での状態遷移をCodeGearに変換したものをCode\ref{src:allocinode_loopcheck}に示す。
318
319
320 \begin{lstlisting}[frame=lrbt,label=src:allocinode_loopcheck,caption={ループ条件を確認するCodeGear}]
321 __code allocinode_loopcheck(struct fs_impl* fs_impl, uint inum, uint dev, struct superblock* sb, struct buf* bp, struct dinode* dip, __code next(...)){
322 if( inum < sb->ninodes){
323 goto allocinode_loop(fs_impl, inum, dev, type, sb, bp, dip, next(...));
324 }
325 char* msg = "failed allocinode...";
326 struct Err* err = createKernelError(&proc->cbc_context);
327 goto err->panic(msg);
328 }
329 \end{lstlisting}
296 330
297 331
298 \section{CbCを用いた部分的なxv6の書き換え} 332 \section{CbCを用いた部分的なxv6の書き換え}
299 333
300 CbCではCodeGear、 DataGearからなる単位を基本とし、 それぞれにメタなGearが付随する。 334 CbCではCodeGear、 DataGearからなる単位を基本とし、 それぞれにメタなGearが付随する。