Mercurial > hg > Papers > 2020 > menikon-thesis
changeset 29:ae7aa3408ba5
fix
author | menikon |
---|---|
date | Mon, 17 Feb 2020 04:37:31 +0900 |
parents | ec182063c27f |
children | 10bdabd06497 |
files | final_main/fig/seni.graffle final_main/fig/seni.pdf final_main/fig/seni.png slide/CbC による xv6 の FileSystem の書き換え.html |
diffstat | 4 files changed, 143 insertions(+), 231 deletions(-) [+] |
line wrap: on
line diff
--- a/slide/CbC による xv6 の FileSystem の書き換え.html Sun Feb 16 18:04:47 2020 +0900 +++ b/slide/CbC による xv6 の FileSystem の書き換え.html Mon Feb 17 04:37:31 2020 +0900 @@ -34,14 +34,14 @@ </head> <body> - <div id="doc" class="markdown-body container-fluid"><h1 id="CbC-による-xv6-の-FileSystem-の書き換え"><a class="anchor hidden-xs" href="#CbC-による-xv6-の-FileSystem-の書き換え" title="CbC-による-xv6-の-FileSystem-の書き換え"><i class="fa fa-link"></i></a>CbC による xv6 の FileSystem の書き換え</h1><ul> + <div id="doc" class="markdown-body container-fluid"><h1 id="CbC-による-xv6-の-FileSystem-の書き換え" style=""><a class="anchor hidden-xs" href="#CbC-による-xv6-の-FileSystem-の書き換え" title="CbC-による-xv6-の-FileSystem-の書き換え"><i class="fa fa-link"></i></a>CbC による xv6 の FileSystem の書き換え</h1><ul> <li> <p>並列信頼研</p> </li> <li> <p>坂本昂弘</p> </li> -</ul><h2 id="研究目的"><a class="anchor hidden-xs" href="#研究目的" title="研究目的"><i class="fa fa-link"></i></a>研究目的</h2><ul> +</ul><h2 id="研究目的" style=""><a class="anchor hidden-xs" href="#研究目的" title="研究目的"><i class="fa fa-link"></i></a>研究目的</h2><ul> <li> <p>OSに対し高い信頼性を実現させたい</p> </li> @@ -52,26 +52,9 @@ <p>前段階としてシンプルであるが基本的な機能を揃えたOSであるxv6をCbCで書き換える</p> </li> <li> -<p>CbCは処理の基本単位をCodeGearとし、stackに値を積む事なくCodeGear間を遷移する</p> -</li> -<li> -<p>CodeGear間は状態遷移であるためOS内部を明確化することができる</p> -</li> -<li> -<p>本研究ではOS内部の明確化を実現し信頼性を向上させるためにCbCを用いFileSystemを書き換える</p> +<p>xv6のFilleSystemをCbCで記述し、なるべく処理を細分化実装してやる</p> </li> -</ul><hr><h1 id="ノーマルレベルとメタレベル"><a class="anchor hidden-xs" href="#ノーマルレベルとメタレベル" title="ノーマルレベルとメタレベル"><i class="fa fa-link"></i></a>ノーマルレベルとメタレベル</h1><ul> -<li>ノーマルレベル -<ul> -<li>プログラマーがしたい処理部分</li> -</ul> -</li> -<li>メタレベル -<ul> -<li>資源管理やCPU自体の操作</li> -</ul> -</li> -</ul><hr><h1 id="Continuation-based-C"><a class="anchor hidden-xs" href="#Continuation-based-C" title="Continuation-based-C"><i class="fa fa-link"></i></a>Continuation based C</h1><ul> +</ul><hr><h1 id="Continuation-based-C" style=""><a class="anchor hidden-xs" href="#Continuation-based-C" title="Continuation-based-C"><i class="fa fa-link"></i></a>Continuation based C</h1><ul> <li>状態遷移ベースで記述できる言語(以下CbC)</li> <li>C の関数呼び出しとは異なり、stack に値を積まない</li> <li>Code Gear @@ -86,39 +69,24 @@ <li>引数など</li> </ul> </li> -<li>Meta Code Gear -<ul> -<li>Code Gear の間に挟まれるメタレベルの処理</li> -</ul> -</li> -<li>Meta Data Gear -<ul> -<li>Code Gearの間の接続などの情報</li> -<li>Context(後ほど説明)</li> -</ul> -</li> -</ul><hr><h1 id="ノーマルレベル"><a class="anchor hidden-xs" href="#ノーマルレベル" title="ノーマルレベル"><i class="fa fa-link"></i></a>ノーマルレベル</h1><hr><h1 id="Code-Gear-による継続"><a class="anchor hidden-xs" href="#Code-Gear-による継続" title="Code-Gear-による継続"><i class="fa fa-link"></i></a>Code Gear による継続</h1><ul> +</ul><hr><h1 id="Code-Gear-による継続" style=""><a class="anchor hidden-xs" href="#Code-Gear-による継続" title="Code-Gear-による継続"><i class="fa fa-link"></i></a>Code Gear による継続</h1><ul> <li>Code Gear の処理の間を goto によって遷移していく</li> <li>__code CodeGear名 で定義<br> <img src="https://i.imgur.com/etfQund.png" alt=""></li> -</ul><hr><h1 id="Data-Gear-の継続"><a class="anchor hidden-xs" href="#Data-Gear-の継続" title="Data-Gear-の継続"><i class="fa fa-link"></i></a>Data Gear の継続</h1><ul> +</ul><hr><h1 id="Data-Gear-の受け渡し" style=""><a class="anchor hidden-xs" href="#Data-Gear-の受け渡し" title="Data-Gear-の受け渡し"><i class="fa fa-link"></i></a>Data Gear の受け渡し</h1><ul> <li>Code Gear からアクセスできるデータ</li> <li>Code Gear の計算の入力と、計算の出力が存在する</li> -</ul><p><img src="https://i.imgur.com/3E0DGWA.png" alt=""></p><hr><h1 id="メタレベル"><a class="anchor hidden-xs" href="#メタレベル" title="メタレベル"><i class="fa fa-link"></i></a>メタレベル</h1><hr><h1 id="Meta-Code-Gear"><a class="anchor hidden-xs" href="#Meta-Code-Gear" title="Meta-Code-Gear"><i class="fa fa-link"></i></a>Meta Code Gear</h1><ul> -<li>メタレベルで見ると Code Gear の間にメタレベルの処理が挟まっている<br> -<img src="https://i.imgur.com/vy0NxrG.png" alt=""></li> -</ul><hr><h1 id="Meta-Data-Gear"><a class="anchor hidden-xs" href="#Meta-Data-Gear" title="Meta-Data-Gear"><i class="fa fa-link"></i></a>Meta Data Gear</h1><ul> -<li>ノーマルレベルでの書き換えやアクセスを防ぐために存在</li> -<li>CbC の 接続可能な Code Gear, Data Gear のリスト</li> -<li>Data Gear を確保するメモリ空間</li> -<li>Context</li> -</ul><hr><h1 id="Context"><a class="anchor hidden-xs" href="#Context" title="Context"><i class="fa fa-link"></i></a>Context</h1><ul> -<li>Meta Data Gear</li> -<li>Contextには全てのData Gear と Code Gear が登録されている</li> -<li>ユーザープロセスに対応して1つのcontextが存在する<br> -<img src="https://i.imgur.com/GLIew1x.png" alt=""></li> -<li>Context でメタレベルとノーマルレベルを中継している</li> -</ul><hr><h1 id="Xv6"><a class="anchor hidden-xs" href="#Xv6" title="Xv6"><i class="fa fa-link"></i></a>Xv6</h1><ul> +</ul><p><img src="https://i.imgur.com/3E0DGWA.png" alt=""></p><hr><h1 id="Data-Gear-の一種であるContext" style=""><a class="anchor hidden-xs" href="#Data-Gear-の一種であるContext" title="Data-Gear-の一種であるContext"><i class="fa fa-link"></i></a>Data Gear の一種であるContext</h1><ul> +<li>Contextには実行するプログラムの全てのData Gear と Code Gear が登録されている</li> +<li>ユーザープロセスに対応して1つのcontextが存在する</li> +<li>CodeGearの入出力は、一度Contextに書き込まれる</li> +<li>Contextは実行している処理の状態を保持している +<ul> +<li>そのためContextを見れば、実行中の処理がわかる<br> +<img src="http://ie.u-ryukyu.ac.jp/~e165723/context.pdf" alt=""></li> +</ul> +</li> +</ul><hr><h1 id="Xv6" style=""><a class="anchor hidden-xs" href="#Xv6" title="Xv6"><i class="fa fa-link"></i></a>Xv6</h1><ul> <li>MIT の講義用教材として作られたOS</li> <li>xv6 は Unix の基本的な構造を持っている。 <ul> @@ -128,25 +96,26 @@ </ul> </li> <li>Xv6 をCbCで書き換える</li> -</ul><hr><h1 id="Xv6のFileSystem"><a class="anchor hidden-xs" href="#Xv6のFileSystem" title="Xv6のFileSystem"><i class="fa fa-link"></i></a>Xv6のFileSystem</h1><ul> +</ul><hr><h1 id="Xv6のFileSystem" style=""><a class="anchor hidden-xs" href="#Xv6のFileSystem" title="Xv6のFileSystem"><i class="fa fa-link"></i></a>Xv6のFileSystem</h1><ul> <li>FileSystem は コンピュータの資源を操作するための OS が持つ機能である</li> <li>xv6 の FileSystem は、デバイスやプロセス、カーネル内の処理をする際の情報などをファイルとして扱う</li> -<li></li> -</ul><hr><h1 id="Xv6の書き換え方針"><a class="anchor hidden-xs" href="#Xv6の書き換え方針" title="Xv6の書き換え方針"><i class="fa fa-link"></i></a>Xv6の書き換え方針</h1><ul> -<li>メタレベルからノーマルレベルを保証するOSを作りたい</li> +<li>inodeを用いファイルの管理や操作を行う</li> +<li>inodeはディスク上にブロックを持つ木構造のデータ構造</li> +</ul><hr><h1 id="Xv6の書き換え方針" style=""><a class="anchor hidden-xs" href="#Xv6の書き換え方針" title="Xv6の書き換え方針"><i class="fa fa-link"></i></a>Xv6の書き換え方針</h1><ul> <li>段階的に書き換えていきたい</li> <li>FileSystem を書き換える理由 <ul> <li>FileSystem は状態が複雑に変化するため、信頼性を保証する必要がある</li> </ul> </li> -<li>__code で書き直していく</li> -</ul><hr><h1 id="インターフェースの導入"><a class="anchor hidden-xs" href="#インターフェースの導入" title="インターフェースの導入"><i class="fa fa-link"></i></a>インターフェースの導入</h1><ul> +<li>インターフェースを定義、実装する</li> +<li>状態遷移ベースにしてやる</li> +</ul><hr><h1 id="インターフェースの導入" style=""><a class="anchor hidden-xs" href="#インターフェースの導入" title="インターフェースの導入"><i class="fa fa-link"></i></a>インターフェースの導入</h1><ul> <li>CbC のモジュール化の方法</li> <li>Javaのインターフェースと同様</li> <li>インターフェースによるメリット <ul> -<li>複雑な記述の解消</li> +<li>複雑な状態の解消</li> <li>入力の切り替えによる実装の入れ替え</li> </ul> </li> @@ -155,12 +124,17 @@ <li>後ほど説明</li> </ul> </li> -</ul><hr><h1 id="CbCインターフェース"><a class="anchor hidden-xs" href="#CbCインターフェース" title="CbCインターフェース"><i class="fa fa-link"></i></a>CbCインターフェース</h1><ul> -<li>Data Gear と Data Gear に対して操作を行う Code Gear の集合を表現する <strong>Meta Data Gear</strong></li> -<li>インターフェースを定義してそこから呼び出す</li> -</ul><hr><h1 id="インターフェースの定義"><a class="anchor hidden-xs" href="#インターフェースの定義" title="インターフェースの定義"><i class="fa fa-link"></i></a>インターフェースの定義</h1><ul> +</ul><hr><h1 id="インターフェースの定義" style=""><a class="anchor hidden-xs" href="#インターフェースの定義" title="インターフェースの定義"><i class="fa fa-link"></i></a>インターフェースの定義</h1><ul> <li>Xv6 の FileSystem の インターフェース</li> <li>typedef struct の直後にインターフェース名(fs)を書く</li> +<li>fs で使う Code Gear を登録する</li> +<li>Code Gear は __code CodeGear名(引数); で記述する +<ul> +<li>引数が Data Gear に相当する</li> +</ul> +</li> +<li>第1引数の Impl* fs がインターフェースの実装の型になる</li> +<li>privateな実装側のヘッダーファイルも インターフェース と同じように用意する</li> </ul><pre><code class="c hljs">typedef <span class="hljs-keyword">struct</span> fs<Type,Impl> { __<span class="hljs-function">code <span class="hljs-title">readsb</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, __code next(...</span>))</span>; __<span class="hljs-function">code <span class="hljs-title">iinit</span>(<span class="hljs-params">Impl* fs, __code next(...</span>))</span>; @@ -169,157 +143,111 @@ __<span class="hljs-function">code <span class="hljs-title">idup</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">struct</span> inode* ip, __code next(...</span>))</span>; .... } fs; -</code></pre><hr><h1 id="インターフェースの-Code-Gear2行目"><a class="anchor hidden-xs" href="#インターフェースの-Code-Gear2行目" title="インターフェースの-Code-Gear2行目"><i class="fa fa-link"></i></a>インターフェースの Code Gear(2行目~)</h1><ul> -<li>fs で使う Code Gear を登録する</li> -<li>Code Gear は __code CodeGear名(引数); で記述する -<ul> -<li>引数が Data Gear に相当する</li> -</ul> -</li> -<li>第1引数の Impl* fs がインターフェースの実装の型になる</li> -</ul><pre><code class="c hljs">typedef <span class="hljs-keyword">struct</span> fs<Type,Impl> { - __<span class="hljs-function">code <span class="hljs-title">readsb</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, __code next(...</span>))</span>; - __<span class="hljs-function">code <span class="hljs-title">iinit</span>(<span class="hljs-params">Impl* fs, __code next(...</span>))</span>; - __<span class="hljs-function">code <span class="hljs-title">ialloc</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, __code next(...</span>))</span>; - __<span class="hljs-function">code <span class="hljs-title">iupdate</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">struct</span> inode* ip, __code next(...</span>))</span>; - __<span class="hljs-function">code <span class="hljs-title">idup</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">struct</span> inode* ip, __code next(...</span>))</span>; -.... - -</code></pre><hr><h1 id="Interface-の実装の型"><a class="anchor hidden-xs" href="#Interface-の実装の型" title="Interface-の実装の型"><i class="fa fa-link"></i></a>Interface の実装の型</h1><ul> -<li>実装側のヘッダーファイルも fs_impl と同じように用意する</li> -</ul><pre><code class="c hljs">typedef <span class="hljs-keyword">struct</span> fs_impl<Type, Isa> impl fs{ - __<span class="hljs-function">code <span class="hljs-title">allocinode</span>(<span class="hljs-params">Type* fs_impl, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, __code next(...</span>))</span>; - __<span class="hljs-function">code <span class="hljs-title">allocinode_loop</span>(<span class="hljs-params">Type* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(...</span>))</span>; - __<span class="hljs-function">code <span class="hljs-title">allocinode_loopcheck</span>(<span class="hljs-params">Type* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(...</span>))</span>; - __<span class="hljs-function">code <span class="hljs-title">allocinode_noloop</span>(<span class="hljs-params">Type* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(<span class="hljs-keyword">int</span> ret, ...</span>))</span>; -.... -} fs_impl; - -</code></pre><hr><h1 id="fsインターフェースの実装の初期化"><a class="anchor hidden-xs" href="#fsインターフェースの実装の初期化" title="fsインターフェースの実装の初期化"><i class="fa fa-link"></i></a>fsインターフェースの実装の初期化</h1><ul> -<li>定義が終わったのでインターフェースを使用したい</li> -<li>メモリ上にインターフェースの置き場所と実装を確保 -<ul> -<li>struct fs* fs = new fs();</li> -</ul> -</li> -<li>インターフェースと実装の紐付け -<ul> -<li>fs->ialloc = C_iallocfs_impl; -<ul> -<li>Code Gear の enum の設定</li> -<li>インターフェースのAPIと enum の番号を紐付けている</li> -</ul> -</li> -</ul> -</li> -</ul><pre><code class="c hljs">fs* createfs_impl(struct Context* cbc_context) { - struct fs* fs = <span class="hljs-keyword">new</span> fs(); - struct fs_impl* fs_impl = <span class="hljs-keyword">new</span> fs_impl(); - fs->fs = (union Data*)fs_impl; -.... - fs->readsb = C_readsbfs_impl; - fs->iinit = C_iinitfs_impl; - fs->ialloc = C_iallocfs_impl; - fs->iupdate = C_iupdatefs_impl; -.... - <span class="hljs-keyword">return</span> fs; -} -</code></pre><hr><h1 id="インターフェースで定義した-CodeGear-の実装の例"><a class="anchor hidden-xs" href="#インターフェースで定義した-CodeGear-の実装の例" title="インターフェースで定義した-CodeGear-の実装の例"><i class="fa fa-link"></i></a>インターフェースで定義した CodeGear の実装の例</h1><ul> -<li>ialloc -<ul> -<li>C_iallocfs_impl が 初期化時に iallocfs_impl と対応する</li> -</ul> -</li> -</ul><pre><code class="c hljs">__<span class="hljs-function">code <span class="hljs-title">iallocfs_impl</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, __code next(...</span>)) </span>{ - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode</span>(<span class="hljs-params">fs, dev, sb, next(...</span>))</span>; -} -</code></pre><hr><h1 id="インターフェース実装内の-CbC"><a class="anchor hidden-xs" href="#インターフェース実装内の-CbC" title="インターフェース実装内の-CbC"><i class="fa fa-link"></i></a>インターフェース実装内の CbC</h1><ul> +</code></pre><hr><h1 id="インターフェース実装内の-CbC" style=""><a class="anchor hidden-xs" href="#インターフェース実装内の-CbC" title="インターフェース実装内の-CbC"><i class="fa fa-link"></i></a>インターフェース実装内の CbC</h1><ul> <li>for文やif文がある場合はさらに実装を分ける <ul> -<li>Basic Block をもとに状態遷移ベースで記述したい</li> +<li>Basic Block をもとに状態遷移ベースで記述することを目標とする</li> </ul> </li> <li>インターフェースは外から呼び出されるAPI</li> <li>それに対してインターフェースの実装の Code Gearから明示的に呼び出される Code Gearは、Java の private メソッドのように扱われる。</li> -<li>実際に fs.c の ialloc の実装を分けた記述を説明する</li> -</ul><p><img src="https://i.imgur.com/pkPvrSI.png" alt=""></p><hr><h1 id="ialloc-の-CbCによる書き換え"><a class="anchor hidden-xs" href="#ialloc-の-CbCによる書き換え" title="ialloc-の-CbCによる書き換え"><i class="fa fa-link"></i></a>ialloc の CbCによる書き換え</h1><ul> +<li>実際に書き換えた一部の例として fs.c の ialloc の実装を分けた記述を説明する</li> +</ul><p><img src="https://ie.u-ryukyu.ac.jp/~e165723/seni.pdf" alt=""></p><pre><code class="clike hljs">__<span class="hljs-function">code <span class="hljs-title">iallocfs_impl</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, __code next(...</span>)) </span>{ + <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode</span>(<span class="hljs-params">fs, dev, sb, next(...</span>))</span>; +} +</code></pre><ul> +<li>関数が呼び出されるとprivate実装に遷移する</li> +</ul><hr><h1 id="ialloc-の-CbCによる書き換え" style=""><a class="anchor hidden-xs" href="#ialloc-の-CbCによる書き換え" title="ialloc-の-CbCによる書き換え"><i class="fa fa-link"></i></a>ialloc の CbCによる書き換え</h1><ul> <li>FileSystemの代表的なAPIであるiallocをCbCで書き直した</li> <li>ialloc <ul> <li>inodeにi-numberという番号を割り当てている</li> </ul> </li> -</ul><h3 id="元ソースコード"><a class="anchor hidden-xs" href="#元ソースコード" title="元ソースコード"><i class="fa fa-link"></i></a>元ソースコード</h3><pre><code class="clike hljs"><span class="hljs-function">struct inode* <span class="hljs-title">ialloc</span> <span class="hljs-params">(uint dev, <span class="hljs-keyword">short</span> type)</span> -</span>{ - <span class="hljs-keyword">int</span> inum; - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">buf</span> *<span class="hljs-title">bp</span>;</span> - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">dinode</span> *<span class="hljs-title">dip</span>;</span> - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">superblock</span> <span class="hljs-title">sb</span>;</span> - - readsb(dev, &sb); - - <span class="hljs-keyword">for</span> (inum = <span class="hljs-number">1</span>; inum < sb.ninodes; inum++) { +</ul><h2 id="元ソースコード" style=""><a class="anchor hidden-xs" href="#元ソースコード" title="元ソースコード"><i class="fa fa-link"></i></a>元ソースコード</h2><ul> +<li>ialloc のソースコードの一部</li> +<li>for文の中でif文の処理が行われ、複雑である</li> +<li>for文とif文を切り分けてやる</li> +</ul><pre><code class="clike hljs"> <span class="hljs-keyword">for</span> (inum = 1; inum < sb.ninodes; inum++) { bp = bread(dev, IBLOCK(inum)); dip = (struct dinode*) bp->data + inum % IPB; - <span class="hljs-keyword">if</span> (dip->type == <span class="hljs-number">0</span>) { <span class="hljs-comment">// a free inode</span> - <span class="hljs-built_in">memset</span>(dip, <span class="hljs-number">0</span>, <span class="hljs-keyword">sizeof</span>(*dip)); - dip->type = type; - log_write(bp); <span class="hljs-comment">// mark it allocated on the disk</span> - brelse(bp); - <span class="hljs-keyword">return</span> iget(dev, inum); - } - - brelse(bp); - } - - panic(<span class="hljs-string">"ialloc: no inodes"</span>); -} -</code></pre><h3 id="iallocの処理の流れ"><a class="anchor hidden-xs" href="#iallocの処理の流れ" title="iallocの処理の流れ"><i class="fa fa-link"></i></a>iallocの処理の流れ</h3><p><img src="https://i.imgur.com/P4kKujB.png" alt=""></p><h3 id="元ソースコード1"><a class="anchor hidden-xs" href="#元ソースコード1" title="元ソースコード1"><i class="fa fa-link"></i></a>元ソースコード</h3><pre><code class="clike hljs"><span class="hljs-function">struct inode* <span class="hljs-title">ialloc</span> <span class="hljs-params">(uint dev, <span class="hljs-keyword">short</span> type)</span> -</span>{ - <span class="hljs-keyword">int</span> inum; - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">buf</span> *<span class="hljs-title">bp</span>;</span> - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">dinode</span> *<span class="hljs-title">dip</span>;</span> - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">superblock</span> <span class="hljs-title">sb</span>;</span> - - readsb(dev, &sb); - - <span class="hljs-keyword">for</span> (inum = <span class="hljs-number">1</span>; inum < sb.ninodes; inum++) { - bp = bread(dev, IBLOCK(inum)); - dip = (struct dinode*) bp->data + inum % IPB; - - <span class="hljs-keyword">if</span> (dip->type == <span class="hljs-number">0</span>) { - <span class="hljs-built_in">memset</span>(dip, <span class="hljs-number">0</span>, <span class="hljs-keyword">sizeof</span>(*dip)); - dip->type = type; + <span class="hljs-keyword">if</span> (dip-><span class="hljs-built_in">type</span> == 0) { + memset(dip, 0, sizeof(*dip)); + dip-><span class="hljs-built_in">type</span> = <span class="hljs-built_in">type</span>; log_write(bp); brelse(bp); - <span class="hljs-keyword">return</span> iget(dev, inum); + <span class="hljs-built_in">return</span> iget(dev, inum); } - - brelse(bp); + .... } + panic(<span class="hljs-string">"ialloc: no inodes"</span>); - panic(<span class="hljs-string">"ialloc: no inodes"</span>); +</code></pre><h2 id="iallocの処理の流れ" style=""><a class="anchor hidden-xs" href="#iallocの処理の流れ" title="iallocの処理の流れ"><i class="fa fa-link"></i></a>iallocの処理の流れ</h2><p><img src="https://ie.u-ryukyu.ac.jp/~e165723/iallocloop.pdf" alt=""></p><h2 id="CbCで書き換えたiallc" style=""><a class="anchor hidden-xs" href="#CbCで書き換えたiallc" title="CbCで書き換えたiallc"><i class="fa fa-link"></i></a>CbCで書き換えたiallc</h2><h3 id="書き換え前" style=""><a class="anchor hidden-xs" href="#書き換え前" title="書き換え前"><i class="fa fa-link"></i></a>書き換え前</h3><ul> +<li>まずfor文のループするかどうか、条件を確認する</li> +</ul><pre><code class="clike hljs"><span class="hljs-keyword">for</span> (inum = 1; inum < sb.ninodes; inum++) { + .... } -</code></pre><h3 id="CbCで書き換えたiallc"><a class="anchor hidden-xs" href="#CbCで書き換えたiallc" title="CbCで書き換えたiallc"><i class="fa fa-link"></i></a>CbCで書き換えたiallc</h3><pre><code class="clike hljs">__<span class="hljs-function">code <span class="hljs-title">iallocfs_impl</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, __code next(...</span>)) </span>{ - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode</span>(<span class="hljs-params">fs, dev, sb, next(...</span>))</span>; +</code></pre><h3 id="書き換え後" style=""><a class="anchor hidden-xs" href="#書き換え後" title="書き換え後"><i class="fa fa-link"></i></a>書き換え後</h3><ul> +<li>ループの条件に合うかどうかを確認するためのCodeGearに遷移する</li> +</ul><pre><code class="clike hljs">__<span class="hljs-function">code <span class="hljs-title">allocinode</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs_impl, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, __code next(...</span>))</span>{ <span class="hljs-comment">//:skip</span> +.... + <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode_loopcheck</span>(<span class="hljs-params">fs_impl, inum, dev, sb, bp, dip, next(...</span>))</span>; } -</code></pre><pre><code class="clike hljs">__<span class="hljs-function">code <span class="hljs-title">allocinode_loopcheck</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(...</span>))</span>{ <span class="hljs-comment">//:skip</span> +</code></pre><ul> +<li>allocinode_loopcheckに遷移しループの条件の確認を行う</li> +</ul><pre><code class="clike hljs">__<span class="hljs-function">code <span class="hljs-title">allocinode_loopcheck</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(...</span>))</span>{ <span class="hljs-comment">//:skip</span> <span class="hljs-keyword">if</span>( inum < sb->ninodes){ <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode_loop</span>(<span class="hljs-params">fs_impl, inum, dev, type, sb, bp, dip, next(...</span>))</span>; } + .... +} +</code></pre><ul> +<li>ループ文の条件に当てはまらなかった場合panicへ遷移し処理が終わる</li> +</ul><pre><code class="clike hljs">__<span class="hljs-function">code <span class="hljs-title">allocinode_loopcheck</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(...</span>))</span>{ <span class="hljs-comment">//:skip</span> + .... <span class="hljs-keyword">char</span>* msg = <span class="hljs-string">"failed allocinode..."</span>; <span class="hljs-keyword">struct</span> Err* err = createKernelError(&proc->cbc_context); Gearef(cbc_context, Err)->msg = msg; <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">meta</span>(<span class="hljs-params">cbc_context, err->panic</span>)</span>; } -__<span class="hljs-function">code <span class="hljs-title">allocinode_loop</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(...</span>))</span>{ <span class="hljs-comment">//:skip</span> - bp = bread(dev, IBLOCK(inum)); - dip = (<span class="hljs-keyword">struct</span> dinode*) bp->data + inum % IPB; +</code></pre><h3 id="書き換え前1" style=""><a class="anchor hidden-xs" href="#書き換え前1" title="書き換え前1"><i class="fa fa-link"></i></a>書き換え前</h3><ul> +<li>for文の中で処理が行われているif文</li> +<li>ループを抜けるか確認</li> +</ul><pre><code class="clike hljs"><span class="hljs-keyword">if</span> (dip-><span class="hljs-built_in">type</span> == 0) { + .... +} +</code></pre><h3 id="書き換え後1" style=""><a class="anchor hidden-xs" href="#書き換え後1" title="書き換え後1"><i class="fa fa-link"></i></a>書き換え後</h3><ul> +<li>ループから抜けるかどうかを確認する</li> +<li>抜ける場合はallocinode_noloopへ遷移する</li> +</ul><pre><code class="clike hljs">__<span class="hljs-function">code <span class="hljs-title">allocinode_loop</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(...</span>))</span>{ <span class="hljs-comment">//:skip</span> + .... <span class="hljs-keyword">if</span>(dip->type = <span class="hljs-number">0</span>){ <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode_noloop</span>(<span class="hljs-params">fs_impl, inum, dev, sb, bp, dip, next(...</span>))</span>; } -__<span class="hljs-function">code <span class="hljs-title">allocinode_noloop</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(<span class="hljs-keyword">int</span> ret, ...</span>))</span>{ <span class="hljs-comment">//:skip</span> + .... +} +</code></pre><ul> +<li>ループから抜けなかった場合</li> +<li>inumの値をインクリメント</li> +<li>再びallocinode_loopcheckへと遷移する</li> +</ul><pre><code class="clike hljs">__<span class="hljs-function">code <span class="hljs-title">allocinode_loop</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(...</span>))</span>{ <span class="hljs-comment">//:skip</span> +.... +inum++; +<span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode_loopcheck</span>(<span class="hljs-params">fs_impl, inum, dev, type, sb, bp, dip, next(...</span>))</span>; +} +</code></pre><h3 id="書き換え前2" style=""><a class="anchor hidden-xs" href="#書き換え前2" title="書き換え前2"><i class="fa fa-link"></i></a>書き換え前</h3><ul> +<li>処理が抜けた場合</li> +<li>変更された値などを更新</li> +<li>logに書き込んでやり保持していた値解放</li> +<li>returnでigetを返し終了</li> +</ul><pre><code class="clike hljs"> memset(dip, 0, sizeof(*dip)); + dip-><span class="hljs-built_in">type</span> = <span class="hljs-built_in">type</span>; + log_write(bp); + brelse(bp); + <span class="hljs-built_in">return</span> iget(dev, inum); +</code></pre><p>- 処理を抜けた場合allocinode_noloopへ遷移<br> +- 処理を行い値を返し終了</p><pre><code class="clike hljs">__<span class="hljs-function">code <span class="hljs-title">allocinode_noloop</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(<span class="hljs-keyword">int</span> ret, ...</span>))</span>{ <span class="hljs-comment">//:skip</span> memset(dip, <span class="hljs-number">0</span>, <span class="hljs-keyword">sizeof</span>(*dip)); dip->type = type; log_write(bp); @@ -327,16 +255,14 @@ ret = iget(dev, inum); <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">next</span>(<span class="hljs-params">ret, ...</span>)</span>; } - brelse(bp); - inum++; - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode_loopcheck</span>(<span class="hljs-params">fs_impl, inum, dev, type, sb, bp, dip, next(...</span>))</span>; -} -</code></pre><hr><h1 id="書き換えの評価"><a class="anchor hidden-xs" href="#書き換えの評価" title="書き換えの評価"><i class="fa fa-link"></i></a>書き換えの評価</h1><ul> + +</code></pre><hr><h1 id="書き換えの評価" style=""><a class="anchor hidden-xs" href="#書き換えの評価" title="書き換えの評価"><i class="fa fa-link"></i></a>書き換えの評価</h1><ul> <li>今回はfor文やif文がある場合切り出してやり、Basic Block 単位に書き換えることができた</li> <li>Basic Block 単位に書き換えたことによって、組み合わせを変え処理の改善などに利用可能</li> -</ul><h2 id="まとめと今後の方針"><a class="anchor hidden-xs" href="#まとめと今後の方針" title="まとめと今後の方針"><i class="fa fa-link"></i></a>まとめと今後の方針</h2><ul> +</ul><h2 id="まとめと今後の方針" style=""><a class="anchor hidden-xs" href="#まとめと今後の方針" title="まとめと今後の方針"><i class="fa fa-link"></i></a>まとめと今後の方針</h2><ul> <li>OS 内部で CbC インターフェースを扱えるようになった</li> -<li>CbC の書 き換えが完了すれば、継続の入力と出力を検査することで OS の信頼性を保証したり、インターフェースの実装の入れ替えが可能になる</li> +<li>CbC の書き換えが完了すれば、継続の入力と出力を検査することで OS の信頼性を保証したり、インターフェースの実装の入れ替えが可能になる</li> +<li>デバックをまだ行っていないため正常に動くかどうか確認することが求められる。</li> </ul></div> <div class="ui-toc dropup unselectable hidden-print" style="display:none;"> <div class="pull-right dropdown"> @@ -345,42 +271,35 @@ </a> <ul id="ui-toc" class="ui-toc-dropdown dropdown-menu" aria-labelledby="tocLabel"> <div class="toc"><ul class="nav"> -<li><a href="#CbC-による-xv6-の-FileSystem-の書き換え" title="CbC による xv6 の FileSystem の書き換え">CbC による xv6 の FileSystem の書き換え</a><ul class="nav"> -<li><a href="#研究目的" title="研究目的">研究目的</a></li> +<li class=""><a href="#CbC-による-xv6-の-FileSystem-の書き換え" title="CbC による xv6 の FileSystem の書き換え">CbC による xv6 の FileSystem の書き換え</a><ul class="nav"> +<li class=""><a href="#研究目的" title="研究目的">研究目的</a></li> </ul> </li> -<li><a href="#ノーマルレベルとメタレベル" title="ノーマルレベルとメタレベル">ノーマルレベルとメタレベル</a></li> <li><a href="#Continuation-based-C" title="Continuation based C">Continuation based C</a></li> -<li><a href="#ノーマルレベル" title="ノーマルレベル">ノーマルレベル</a></li> <li><a href="#Code-Gear-による継続" title="Code Gear による継続">Code Gear による継続</a></li> -<li><a href="#Data-Gear-の継続" title="Data Gear の継続">Data Gear の継続</a></li> -<li><a href="#メタレベル" title="メタレベル">メタレベル</a></li> -<li><a href="#Meta-Code-Gear" title="Meta Code Gear">Meta Code Gear</a></li> -<li><a href="#Meta-Data-Gear" title="Meta Data Gear">Meta Data Gear</a></li> -<li><a href="#Context" title="Context">Context</a></li> +<li><a href="#Data-Gear-の受け渡し" title="Data Gear の受け渡し">Data Gear の受け渡し</a></li> +<li><a href="#Data-Gear-の一種であるContext" title="Data Gear の一種であるContext">Data Gear の一種であるContext</a></li> <li><a href="#Xv6" title="Xv6">Xv6</a></li> <li><a href="#Xv6のFileSystem" title="Xv6のFileSystem">Xv6のFileSystem</a></li> <li><a href="#Xv6の書き換え方針" title="Xv6の書き換え方針">Xv6の書き換え方針</a></li> <li><a href="#インターフェースの導入" title="インターフェースの導入">インターフェースの導入</a></li> -<li><a href="#CbCインターフェース" title="CbCインターフェース">CbCインターフェース</a></li> <li><a href="#インターフェースの定義" title="インターフェースの定義">インターフェースの定義</a></li> -<li><a href="#インターフェースの-Code-Gear2行目" title="インターフェースの Code Gear(2行目~)">インターフェースの Code Gear(2行目~)</a></li> -<li class=""><a href="#Interface-の実装の型" title="Interface の実装の型">Interface の実装の型</a></li> -<li class=""><a href="#fsインターフェースの実装の初期化" title="fsインターフェースの実装の初期化">fsインターフェースの実装の初期化</a></li> -<li class=""><a href="#インターフェースで定義した-CodeGear-の実装の例" title="インターフェースで定義した CodeGear の実装の例">インターフェースで定義した CodeGear の実装の例</a></li> -<li class=""><a href="#インターフェース実装内の-CbC" title="インターフェース実装内の CbC">インターフェース実装内の CbC</a></li> -<li class=""><a href="#ialloc-の-CbCによる書き換え" title="ialloc の CbCによる書き換え">ialloc の CbCによる書き換え</a><ul class="nav"> -<li class="invisable-node"><ul class="nav"> -<li class=""><a href="#元ソースコード" title="元ソースコード">元ソースコード</a></li> -<li class=""><a href="#iallocの処理の流れ" title="iallocの処理の流れ">iallocの処理の流れ</a></li> -<li class=""><a href="#元ソースコード1" title="元ソースコード">元ソースコード</a></li> -<li class=""><a href="#CbCで書き換えたiallc" title="CbCで書き換えたiallc">CbCで書き換えたiallc</a></li> +<li><a href="#インターフェース実装内の-CbC" title="インターフェース実装内の CbC">インターフェース実装内の CbC</a></li> +<li><a href="#ialloc-の-CbCによる書き換え" title="ialloc の CbCによる書き換え">ialloc の CbCによる書き換え</a><ul class="nav"> +<li><a href="#元ソースコード" title="元ソースコード">元ソースコード</a></li> +<li><a href="#iallocの処理の流れ" title="iallocの処理の流れ">iallocの処理の流れ</a></li> +<li><a href="#CbCで書き換えたiallc" title="CbCで書き換えたiallc">CbCで書き換えたiallc</a><ul class="nav"> +<li><a href="#書き換え前" title="書き換え前">書き換え前</a></li> +<li><a href="#書き換え後" title="書き換え後">書き換え後</a></li> +<li><a href="#書き換え前1" title="書き換え前">書き換え前</a></li> +<li><a href="#書き換え後1" title="書き換え後">書き換え後</a></li> +<li><a href="#書き換え前2" title="書き換え前">書き換え前</a></li> </ul> </li> </ul> </li> -<li class=""><a href="#書き換えの評価" title="書き換えの評価">書き換えの評価</a><ul class="nav"> -<li class=""><a href="#まとめと今後の方針" title="まとめと今後の方針">まとめと今後の方針</a></li> +<li><a href="#書き換えの評価" title="書き換えの評価">書き換えの評価</a><ul class="nav"> +<li><a href="#まとめと今後の方針" title="まとめと今後の方針">まとめと今後の方針</a></li> </ul> </li> </ul> @@ -390,42 +309,35 @@ </div> <div id="ui-toc-affix" class="ui-affix-toc ui-toc-dropdown unselectable hidden-print" data-spy="affix" style="top:17px;display:none;" > <div class="toc"><ul class="nav"> -<li><a href="#CbC-による-xv6-の-FileSystem-の書き換え" title="CbC による xv6 の FileSystem の書き換え">CbC による xv6 の FileSystem の書き換え</a><ul class="nav"> -<li><a href="#研究目的" title="研究目的">研究目的</a></li> +<li class=""><a href="#CbC-による-xv6-の-FileSystem-の書き換え" title="CbC による xv6 の FileSystem の書き換え">CbC による xv6 の FileSystem の書き換え</a><ul class="nav"> +<li class=""><a href="#研究目的" title="研究目的">研究目的</a></li> </ul> </li> -<li><a href="#ノーマルレベルとメタレベル" title="ノーマルレベルとメタレベル">ノーマルレベルとメタレベル</a></li> <li><a href="#Continuation-based-C" title="Continuation based C">Continuation based C</a></li> -<li><a href="#ノーマルレベル" title="ノーマルレベル">ノーマルレベル</a></li> <li><a href="#Code-Gear-による継続" title="Code Gear による継続">Code Gear による継続</a></li> -<li><a href="#Data-Gear-の継続" title="Data Gear の継続">Data Gear の継続</a></li> -<li><a href="#メタレベル" title="メタレベル">メタレベル</a></li> -<li><a href="#Meta-Code-Gear" title="Meta Code Gear">Meta Code Gear</a></li> -<li><a href="#Meta-Data-Gear" title="Meta Data Gear">Meta Data Gear</a></li> -<li><a href="#Context" title="Context">Context</a></li> +<li><a href="#Data-Gear-の受け渡し" title="Data Gear の受け渡し">Data Gear の受け渡し</a></li> +<li><a href="#Data-Gear-の一種であるContext" title="Data Gear の一種であるContext">Data Gear の一種であるContext</a></li> <li><a href="#Xv6" title="Xv6">Xv6</a></li> <li><a href="#Xv6のFileSystem" title="Xv6のFileSystem">Xv6のFileSystem</a></li> <li><a href="#Xv6の書き換え方針" title="Xv6の書き換え方針">Xv6の書き換え方針</a></li> <li><a href="#インターフェースの導入" title="インターフェースの導入">インターフェースの導入</a></li> -<li><a href="#CbCインターフェース" title="CbCインターフェース">CbCインターフェース</a></li> <li><a href="#インターフェースの定義" title="インターフェースの定義">インターフェースの定義</a></li> -<li><a href="#インターフェースの-Code-Gear2行目" title="インターフェースの Code Gear(2行目~)">インターフェースの Code Gear(2行目~)</a></li> -<li class=""><a href="#Interface-の実装の型" title="Interface の実装の型">Interface の実装の型</a></li> -<li class=""><a href="#fsインターフェースの実装の初期化" title="fsインターフェースの実装の初期化">fsインターフェースの実装の初期化</a></li> -<li class=""><a href="#インターフェースで定義した-CodeGear-の実装の例" title="インターフェースで定義した CodeGear の実装の例">インターフェースで定義した CodeGear の実装の例</a></li> -<li class=""><a href="#インターフェース実装内の-CbC" title="インターフェース実装内の CbC">インターフェース実装内の CbC</a></li> -<li class=""><a href="#ialloc-の-CbCによる書き換え" title="ialloc の CbCによる書き換え">ialloc の CbCによる書き換え</a><ul class="nav"> -<li class="invisable-node"><ul class="nav"> -<li class=""><a href="#元ソースコード" title="元ソースコード">元ソースコード</a></li> -<li class=""><a href="#iallocの処理の流れ" title="iallocの処理の流れ">iallocの処理の流れ</a></li> -<li class=""><a href="#元ソースコード1" title="元ソースコード">元ソースコード</a></li> -<li class=""><a href="#CbCで書き換えたiallc" title="CbCで書き換えたiallc">CbCで書き換えたiallc</a></li> +<li><a href="#インターフェース実装内の-CbC" title="インターフェース実装内の CbC">インターフェース実装内の CbC</a></li> +<li><a href="#ialloc-の-CbCによる書き換え" title="ialloc の CbCによる書き換え">ialloc の CbCによる書き換え</a><ul class="nav"> +<li><a href="#元ソースコード" title="元ソースコード">元ソースコード</a></li> +<li><a href="#iallocの処理の流れ" title="iallocの処理の流れ">iallocの処理の流れ</a></li> +<li><a href="#CbCで書き換えたiallc" title="CbCで書き換えたiallc">CbCで書き換えたiallc</a><ul class="nav"> +<li><a href="#書き換え前" title="書き換え前">書き換え前</a></li> +<li><a href="#書き換え後" title="書き換え後">書き換え後</a></li> +<li><a href="#書き換え前1" title="書き換え前">書き換え前</a></li> +<li><a href="#書き換え後1" title="書き換え後">書き換え後</a></li> +<li><a href="#書き換え前2" title="書き換え前">書き換え前</a></li> </ul> </li> </ul> </li> -<li class=""><a href="#書き換えの評価" title="書き換えの評価">書き換えの評価</a><ul class="nav"> -<li class=""><a href="#まとめと今後の方針" title="まとめと今後の方針">まとめと今後の方針</a></li> +<li><a href="#書き換えの評価" title="書き換えの評価">書き換えの評価</a><ul class="nav"> +<li><a href="#まとめと今後の方針" title="まとめと今後の方針">まとめと今後の方針</a></li> </ul> </li> </ul>