comparison paper/anatofuz-sigos.md @ 38:32453ef823d9

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Wed, 06 May 2020 13:33:25 +0900
parents 9e40a7a00a02
children a91592fafeb1
comparison
equal deleted inserted replaced
37:9e40a7a00a02 38:32453ef823d9
159 # xv6のシステムコール以外の継続の分析 159 # xv6のシステムコール以外の継続の分析
160 xv6はシステムコール以外に、 ファイルシステムの操作やページテーブルの管理などの処理も存在している。 160 xv6はシステムコール以外に、 ファイルシステムの操作やページテーブルの管理などの処理も存在している。
161 これらはOSの立ち上げ時やシステムコールの中で、ファイルシステムの操作に対応した関数や構造体などのAPIを通して操作される。 161 これらはOSの立ち上げ時やシステムコールの中で、ファイルシステムの操作に対応した関数や構造体などのAPIを通して操作される。
162 システムコールの一連の流れに着目するのではなく、 特定の対象のAPIに着目して継続の分析を検討した。 162 システムコールの一連の流れに着目するのではなく、 特定の対象のAPIに着目して継続の分析を検討した。
163 163
164 xv6のファイルシステムに関する定義ファイルは`fs.c`中に記述されている。 164 xv6のファイルシステムに関する関数などのAPIは主に`fs.c`中に記述されている。
165 Code\ref{src:fs_interface}に示す様に、 `fs.c`中に定義されているAPIを抜き出し、 CbCのInterfaceとして定義した。 165 Code\ref{src:fs_interface}に示す様に、 `fs.c`中に定義されているAPIを抜き出し、 CbCのInterfaceとして定義した。
166 `__code`から始まるCodeGearの名前が、 それぞれ抽象化されたCodeGearの集合の最初の継続となる。 166 `__code`から始まるCodeGearの名前が、 それぞれ抽象化されたCodeGearの集合の最初の継続となる。
167 167
168 168
169 ``` lab:src:fs_interface, cap:ファイルシステム操作のAPIの一部 169 ``` lab:src:fs_interface, cap:ファイルシステム操作のAPIの一部
183 Code\ref{src:fs_interface}内の `readsb`などは`fs.c`内で定義されているCの関数名と対応している。 183 Code\ref{src:fs_interface}内の `readsb`などは`fs.c`内で定義されているCの関数名と対応している。
184 このCの関数を更に継続ごと分割するために、 関数内のif文などの分岐を持たない基本単位であるBasic Blockに着目した。 184 このCの関数を更に継続ごと分割するために、 関数内のif文などの分岐を持たない基本単位であるBasic Blockに着目した。
185 185
186 CbCのCodeGearの粒度はCの関数とアセンブラの中間であるといえるので、 BasicBlockをCodeGearに置き換える事が可能である。 186 CbCのCodeGearの粒度はCの関数とアセンブラの中間であるといえるので、 BasicBlockをCodeGearに置き換える事が可能である。
187 したがって特定の関数内の処理のBasicBlockを分析し、 BasicBlockに対応したCodeGearへ変換することが可能となる。 187 したがって特定の関数内の処理のBasicBlockを分析し、 BasicBlockに対応したCodeGearへ変換することが可能となる。
188 実際にBasicBlock単位で切り分ける前の処理と、切り分けたあとの処理を示す。 188 実際にBasicBlock単位で切り分ける前の処理と、切り分けたあとの処理の一部を示す。
189 189 例としてinodeのアロケーションを行うAPIでる`ialloc`の元のコードをCode\ref{src:ialloc_origin}に示す。
190
191 ``` lab:src:ialloc_origin, cap:iallocの元のソースコード
192 struct inode* ialloc (uint dev, short type)
193 {
194 readsb(dev, &sb);
195 for (inum = 1; inum < sb.ninodes; inum++) {
196 bp = bread(dev, IBLOCK(inum));
197 dip = (struct dinode*) bp->data + inum % IPB;
198
199 if (dip->type == 0) { // a free inode
200 memset(dip, 0, sizeof(*dip));
201 // omission
202 return iget(dev, inum);
203 }
204 brelse(bp);
205 }
206 panic("ialloc: no inodes");
207 }
208 ```
209
210 `ialloc`はループ条件である `inum < sb.ninodes`が成立しなかった場合は`panic`へと状態が遷移する。
211 この`for`文での状態遷移をCodeGearに変換したものをCode\ref{src:allocinode_loopcheck}に示す。
212
213
214 ``` lab:src:allocinode_loopcheck, cap:ループ条件を確認するCodeGear
215 __code allocinode_loopcheck(struct fs_impl* fs_impl, uint inum, uint dev, struct superblock* sb, struct buf* bp, struct dinode* dip, __code next(...)){
216 if( inum < sb->ninodes){
217 goto allocinode_loop(fs_impl, inum, dev, type, sb, bp, dip, next(...));
218 }
219 char* msg = "failed allocinode...";
220 struct Err* err = createKernelError(&proc->cbc_context);
221 goto err->panic(msg);
222 }
223 ```
190 224
191 225
192 # CbCを用いた部分的なxv6の書き換え 226 # CbCを用いた部分的なxv6の書き換え
193 227
194 CbCではCodeGear、 DataGearからなる単位を基本とし、 それぞれにメタなGearが付随する。 228 CbCではCodeGear、 DataGearからなる単位を基本とし、 それぞれにメタなGearが付随する。