# HG changeset patch # User anatofuz # Date 1588739605 -32400 # Node ID 32453ef823d93a06d3b2521a80447fe398e907e4 # Parent 9e40a7a00a02f5da9dc40302f8c9f693a41ecc67 update diff -r 9e40a7a00a02 -r 32453ef823d9 paper/anatofuz-sigos.md --- a/paper/anatofuz-sigos.md Wed May 06 07:50:03 2020 +0900 +++ b/paper/anatofuz-sigos.md Wed May 06 13:33:25 2020 +0900 @@ -161,7 +161,7 @@ これらはOSの立ち上げ時やシステムコールの中で、ファイルシステムの操作に対応した関数や構造体などのAPIを通して操作される。 システムコールの一連の流れに着目するのではなく、 特定の対象のAPIに着目して継続の分析を検討した。 -xv6のファイルシステムに関する定義ファイルは`fs.c`中に記述されている。 +xv6のファイルシステムに関する関数などのAPIは主に`fs.c`中に記述されている。 Code\ref{src:fs_interface}に示す様に、 `fs.c`中に定義されているAPIを抜き出し、 CbCのInterfaceとして定義した。 `__code`から始まるCodeGearの名前が、 それぞれ抽象化されたCodeGearの集合の最初の継続となる。 @@ -185,8 +185,42 @@ CbCのCodeGearの粒度はCの関数とアセンブラの中間であるといえるので、 BasicBlockをCodeGearに置き換える事が可能である。 したがって特定の関数内の処理のBasicBlockを分析し、 BasicBlockに対応したCodeGearへ変換することが可能となる。 -実際にBasicBlock単位で切り分ける前の処理と、切り分けたあとの処理を示す。 +実際にBasicBlock単位で切り分ける前の処理と、切り分けたあとの処理の一部を示す。 +例としてinodeのアロケーションを行うAPIでる`ialloc`の元のコードをCode\ref{src:ialloc_origin}に示す。 + +``` lab:src:ialloc_origin, cap:iallocの元のソースコード +struct inode* ialloc (uint dev, short type) +{ + readsb(dev, &sb); + for (inum = 1; inum < sb.ninodes; inum++) { + bp = bread(dev, IBLOCK(inum)); + dip = (struct dinode*) bp->data + inum % IPB; + if (dip->type == 0) { // a free inode + memset(dip, 0, sizeof(*dip)); + // omission + return iget(dev, inum); + } + brelse(bp); + } + panic("ialloc: no inodes"); +} +``` + + `ialloc`はループ条件である `inum < sb.ninodes`が成立しなかった場合は`panic`へと状態が遷移する。 + この`for`文での状態遷移をCodeGearに変換したものをCode\ref{src:allocinode_loopcheck}に示す。 + + +``` lab:src:allocinode_loopcheck, cap:ループ条件を確認するCodeGear +__code allocinode_loopcheck(struct fs_impl* fs_impl, uint inum, uint dev, struct superblock* sb, struct buf* bp, struct dinode* dip, __code next(...)){ + if( inum < sb->ninodes){ + goto allocinode_loop(fs_impl, inum, dev, type, sb, bp, dip, next(...)); + } + char* msg = "failed allocinode..."; + struct Err* err = createKernelError(&proc->cbc_context); + goto err->panic(msg); +} +``` # CbCを用いた部分的なxv6の書き換え diff -r 9e40a7a00a02 -r 32453ef823d9 paper/anatofuz-sigos.pdf Binary file paper/anatofuz-sigos.pdf has changed