comparison paper/anatofuz-sigos.md @ 40:a91592fafeb1

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Wed, 06 May 2020 15:56:16 +0900
parents 32453ef823d9
children 7bba4d91db3b
comparison
equal deleted inserted replaced
39:228d350be33e 40:a91592fafeb1
220 struct Err* err = createKernelError(&proc->cbc_context); 220 struct Err* err = createKernelError(&proc->cbc_context);
221 goto err->panic(msg); 221 goto err->panic(msg);
222 } 222 }
223 ``` 223 ```
224 224
225 Code\ref{src:allocinode_loopcheck}ではループ条件の成立を`if`文で確認し、ループ処理に移行する場合は `allocinode_loop`へ遷移する。
226 ループ条件が満たされなかった場合は、 コンテキストから`panic`に関するCodeGearの集合を取り出し、 集合中の`panic` CodeGearへと遷移する。
227 オリジナルの処理では、 ループ中に`dip->type == 0`が満たされた場合は関数から`return`文により関数から復帰する。
228 CodeGearではCode\ref{src:alloc_loop}内で、 状態が分けられる。
229 この先の継続は、 復帰用のCodeGearかループの先頭である`allocinode_loopcheck`に再帰的に遷移するかになる。
230
231 ``` lab:src:alloc_loop, cap:ループ中に復帰するかどうかの確認をするCodeGear
232 __code allocinode_loop(struct fs_impl* fs_impl, uint inum, uint dev, short type, struct superblock* sb, struct buf* bp, struct dinode* dip, __code next(...)){
233 bp = bread(dev, IBLOCK(inum));
234 dip = (struct dinode*) bp->data + inum % IPB;
235 if(dip->type = 0){
236 goto allocinode_loopexit(fs_impl, inum, dev, sb, bp, dip, next(...));
237 }
238
239 brelse(bp);
240 inum++;
241 goto allocinode_loopcheck(fs_impl, inum, dev, type, sb, bp, dip, next(...));
242 }
243 ```
244
245 この継続の分析方法の利点として、 既存のコードのBasic Block単位でCodeGearに変換可能であるため機械的にCodeGearへの変更が可能となる。
246 既存の関数上のアルゴリズムや処理に殆ど変更がなく変更可能であるために、 CodeGearで細分化して表現することは容易となる。
247 しかし従来のxv6の関数呼び出しを元にしたAPIの中でCodeGearに分割しているために、 API内の処理の細分化は可能であるがAPIをつかった処理をCodeGearで適した形で表現できていない。
248
225 249
226 # CbCを用いた部分的なxv6の書き換え 250 # CbCを用いた部分的なxv6の書き換え
227 251
228 CbCではCodeGear、 DataGearからなる単位を基本とし、 それぞれにメタなGearが付随する。 252 CbCではCodeGear、 DataGearからなる単位を基本とし、 それぞれにメタなGearが付随する。
229 また実行に必要なCodeGearとDataGearをまとめたcontextというMetaDataGearが存在する。 253 また実行に必要なCodeGearとDataGearをまとめたcontextというMetaDataGearが存在する。