Mercurial > hg > Papers > 2020 > anatofuz-sigos
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が付随する。 |