Mercurial > hg > Papers > 2020 > tobaru-master
changeset 32:4c24694af0b0
slide html
author | tobaru |
---|---|
date | Sun, 09 Feb 2020 22:55:38 +0900 |
parents | 69ac4230c3f2 |
children | e68c3bd31098 |
files | slide/CbCXv6.html |
diffstat | 1 files changed, 263 insertions(+), 394 deletions(-) [+] |
line wrap: on
line diff
--- a/slide/CbCXv6.html Sun Feb 09 22:52:56 2020 +0900 +++ b/slide/CbCXv6.html Sun Feb 09 22:55:38 2020 +0900 @@ -34,62 +34,49 @@ </head> <body> - <div id="doc" class="markdown-body container-fluid comment-enabled" data-hard-breaks="true"><h1 id="CbCインターフェースによる-CbCXv6-の書き換え" style=""><a class="anchor hidden-xs" href="#CbCインターフェースによる-CbCXv6-の書き換え" title="CbCインターフェースによる-CbCXv6-の書き換え"><span class="octicon octicon-link"></span></a>CbCインターフェースによる CbCXv6 の書き換え</h1><ul> + <div id="doc" class="markdown-body container-fluid comment-enabled" data-hard-breaks="true" style="position: relative;"><h1 class="highlight" id="CbCインターフェースによる-CbCXv6-の書き換え" style=""><a class="anchor hidden-xs" href="#CbCインターフェースによる-CbCXv6-の書き換え" title="CbCインターフェースによる-CbCXv6-の書き換え"><span class="octicon octicon-link"></span></a>CbCインターフェースによる CbCXv6 の書き換え</h1><ul> <li>並列信頼研</li> <li>桃原 優</li> -</ul><hr><h1 id="目次" style=""><a class="anchor hidden-xs" href="#目次" title="目次"><span class="octicon octicon-link"></span></a>目次</h1><ol> -<li><strong>OS の信頼性の保証</strong></li> -<li>CbC による Gears OS の開発</li> -<li>Xv6</li> -<li>CbCXv6 での Paging</li> -<li>CbC インターフェース</li> -<li>評価</li> -<li>まとめ</li> -</ol><hr><h1 id="OS-の信頼性の重要性" style=""><a class="anchor hidden-xs" href="#OS-の信頼性の重要性" title="OS-の信頼性の重要性"><span class="octicon octicon-link"></span></a>OS の信頼性の重要性</h1><ul> -<li>OS のバグは日常生活に支障をきたす +</ul><hr><h1 class="highlight" id="概要" style=""><a class="anchor hidden-xs" href="#概要" title="概要"><span class="octicon octicon-link"></span></a>概要</h1><ul> +<li>OS の信頼性を上げたい</li> +<li>CbCを使って xv6 という OS を書き換える</li> +<li>Paging の書き換えを行った</li> +<li>まだ実装中</li> +<li>将来はコンテナやVMをメタ計算として実装できるはず</li> +</ul><hr><h1 id="OS-の信頼性を上げたい" style=""><a class="anchor hidden-xs" href="#OS-の信頼性を上げたい" title="OS-の信頼性を上げたい"><span class="octicon octicon-link"></span></a>OS の信頼性を上げたい</h1><ul class="highlight"> +<li>仕様を満たすことを証明する</li> +<li>証明しやすい形の記述を作る</li> +<li>CbCの goto で書く <ul> -<li>パスワードなしで root にアクセスできるバグ</li> -<li>日付設定でコンピュータが壊れる</li> -<li>-> OS自体に信頼性が求められる</li> +<li>状態遷移系に近い形で記述できる(証明しやすい)</li> +<li>関数型の記述</li> </ul> </li> -</ul><hr><h1 id="OS-の信頼性の重要性1" style=""><a class="anchor hidden-xs" href="#OS-の信頼性の重要性1" title="OS-の信頼性の重要性1"><span class="octicon octicon-link"></span></a>OS の信頼性の重要性</h1><ul> -<li> -<p>全てのOSのコードに対して検証を行うのは困難</p> -<ul> -<li>複雑な機能が多い</li> -<li>短期間のアップデート</li> -</ul> -</li> -<li> -<p>ユーザーが検証を行うこともできない</p> -<ul> -<li>資源管理はOSが行なってる</li> -<li>そもそも資源管理が複雑</li> -<li>アクセスされたり書き換えられるリスク</li> -</ul> -</li> -</ul><hr><h1 id="メタレベルとノーマルレベル" style=""><a class="anchor hidden-xs" href="#メタレベルとノーマルレベル" title="メタレベルとノーマルレベル"><span class="octicon octicon-link"></span></a>メタレベルとノーマルレベル</h1><ul> +<li>CbCのinterface で書く</li> +<li>記述のモジュール化</li> +</ul><hr><h1 id="メタレベルとノーマルレベル" style=""><a class="anchor hidden-xs" href="#メタレベルとノーマルレベル" title="メタレベルとノーマルレベル"><span class="octicon octicon-link"></span></a>メタレベルとノーマルレベル</h1><ul class="highlight"> <li>ノーマルレベル <ul> -<li>ユーザーがプログラミング言語によって記述する部分の処理</li> +<li>CbCで記述される普通のアルゴリズム</li> </ul> </li> <li>メタレベル <ul> -<li>ユーザーが記述しないOS 側の処理 -<ul> -<li>CPU</li> -<li>メモリ</li> +<li>Paging などのメモリやCPU自体の操作</li> +<li>プログラムの正しさの証明</li> </ul> </li> +<li>Context +<ul> +<li>メタレベルで使用される Meta Data を置く場所</li> </ul> </li> -</ul><hr><h1 id="Continuation-based-C" style=""><a class="anchor hidden-xs" href="#Continuation-based-C" title="Continuation-based-C"><span class="octicon octicon-link"></span></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"><span class="octicon octicon-link"></span></a>Continuation based C</h1><ul class="highlight"> <li>ノーマルレベルとメタレベルの処理を同じ言語で行えるようにした言語(以下CbC)</li> <li>Code Gear <ul> <li>基本的な処理の単位</li> +<li>goto 文で遷移する</li> </ul> </li> <li>Data Gear @@ -97,212 +84,125 @@ <li>データの単位</li> </ul> </li> +<li>Meta Code Gear +<ul> +<li>goto meta</li> +<li>Code Gear の間に挟める計算</li> +</ul> +</li> +<li>Meta Data Gear +<ul> +<li>Context</li> +<li>Code Gearの間の接続など</li> +</ul> +</li> </ul><hr><h1 id="goto-による継続" style=""><a class="anchor hidden-xs" href="#goto-による継続" title="goto-による継続"><span class="octicon octicon-link"></span></a>goto による継続</h1><ul> <li>Code Gear の処理の間を goto によって遷移していく</li> </ul><p><img src="https://i.imgur.com/etfQund.png" alt=""></p><hr><h1 id="Data-Gear-の継続" style=""><a class="anchor hidden-xs" href="#Data-Gear-の継続" title="Data-Gear-の継続"><span class="octicon octicon-link"></span></a>Data Gear の継続</h1><ul> +<li>Code Gear で定義されたデータ</li> <li>goto の際に Data Gear も継続される</li> </ul><p><img src="https://i.imgur.com/3E0DGWA.png" alt=""></p><hr><h1 id="Meta-Code-Gear" style=""><a class="anchor hidden-xs" href="#Meta-Code-Gear" title="Meta-Code-Gear"><span class="octicon octicon-link"></span></a>Meta Code Gear</h1><ul> <li>実際にはノーマルレベルの間にメタレベルの処理がある</li> -<li>Meta Level では Data Gear の見え方は変わる(Meta Data Gear)</li> -</ul><p><img src="https://i.imgur.com/vy0NxrG.png" alt=""></p><hr><h1 id="状態遷移モデル" style=""><a class="anchor hidden-xs" href="#状態遷移モデル" title="状態遷移モデル"><span class="octicon octicon-link"></span></a>状態遷移モデル</h1><ul> -<li>goto の遷移によって状態遷移モデルに落とし込める</li> -<li>Code Gear に対しての入力に対して期待される出力がされているかで検査して<strong>信頼性を保証する</strong></li> -</ul><hr><h1 id="Agda-による検証" style=""><a class="anchor hidden-xs" href="#Agda-による検証" title="Agda-による検証"><span class="octicon octicon-link"></span></a>Agda による検証</h1><ul> -<li>モデル検査 -<ul> -<li>定理証明支援系である Agda を用いる。</li> -</ul> -</li> -<li>Agda -<ul> -<li>Haure Logic という検証手法を扱える。</li> -</ul> -</li> -</ul><hr><h1 id="Haure-Logic" style=""><a class="anchor hidden-xs" href="#Haure-Logic" title="Haure-Logic"><span class="octicon octicon-link"></span></a>Haure Logic</h1><ul> -<li>検証手法 -<ul> -<li>事前条件を使ってある関数を実行して事後条件を満たすことを確認する</li> -</ul> -</li> -<li>CbCと相性がいい -<ul> -<li>継続に事前条件(Input Data Gear)と事後条件(Output Data Gear)を持たせることができる</li> -</ul> -</li> -</ul><hr><h1 id="Geas-OS" style=""><a class="anchor hidden-xs" href="#Geas-OS" title="Geas-OS"><span class="octicon octicon-link"></span></a>Geas OS</h1><ul> -<li>CbC を使って信頼性の保証と拡張性を持たせる Gears OS の開発を行なっている</li> -<li>Xv6 という OS を参考に書き換えをしている</li> -</ul><hr><h1 id="メモリ管理" style=""><a class="anchor hidden-xs" href="#メモリ管理" title="メモリ管理"><span class="octicon octicon-link"></span></a>メモリ管理</h1><ul> -<li>OS の信頼性の1つであるメモリ管理部分を CbC で書き換える -<ul> -<li>Page のバリデーションチェック</li> -<li>サンドボックスによるエクセプション</li> -</ul> -</li> -</ul><hr><h1 id="インターフェース" style=""><a class="anchor hidden-xs" href="#インターフェース" title="インターフェース"><span class="octicon octicon-link"></span></a>インターフェース</h1><ul> -<li>書き換えを防ぐために見える Data Gear に違いが生じる</li> -<li>-> Gears OS のノーマルレベルからメタレベルの記述が記述が煩雑になるためインターフェースを導入</li> -<li>機能の入れ替えによる他のメリット -<ul> -<li>煩雑な記述の解消</li> -<li>機能の入れ替え</li> -<li>Agda による証明</li> -</ul> -</li> -</ul><hr><h1 id="目次1" style=""><a class="anchor hidden-xs" href="#目次1" title="目次1"><span class="octicon octicon-link"></span></a>目次</h1><ol> -<li>OS の信頼性の保証</li> -<li><strong>CbC による Gears OS の開発</strong></li> -<li>Xv6</li> -<li>CbCXv6 での Paging</li> -<li>CbC インターフェース</li> -<li>評価</li> -<li>まとめ</li> -</ol><hr><h1 id="CbC-による-Gears-OS-の開発" style=""><a class="anchor hidden-xs" href="#CbC-による-Gears-OS-の開発" title="CbC-による-Gears-OS-の開発"><span class="octicon octicon-link"></span></a>CbC による Gears OS の開発</h1><ul> -<li>a</li> -</ul><hr><h1 id="Context" style=""><a class="anchor hidden-xs" href="#Context" title="Context"><span class="octicon octicon-link"></span></a>Context</h1><ul> -<li>a</li> -</ul><hr><h1 id="目次2" style=""><a class="anchor hidden-xs" href="#目次2" title="目次2"><span class="octicon octicon-link"></span></a>目次</h1><ol> -<li>OS の信頼性の保証</li> -<li>CbC による Gears OS の開発</li> -<li><strong>Xv6</strong></li> -<li>CbCXv6 での Paging</li> -<li>CbC インターフェース</li> -<li>評価</li> -<li>まとめ</li> -</ol><hr><h1 id="Xv6" style=""><a class="anchor hidden-xs" href="#Xv6" title="Xv6"><span class="octicon octicon-link"></span></a>Xv6</h1><ul> +</ul><p><img src="https://i.imgur.com/vy0NxrG.png" alt=""></p><hr><h1 id="Meta-Data-Gear" style=""><a class="anchor hidden-xs" href="#Meta-Data-Gear" title="Meta-Data-Gear"><span class="octicon octicon-link"></span></a>Meta Data Gear</h1><ul> +<li>CbC では接続可能な Code Gear, Data Gear のリスト</li> +<li>Data Gear を確保するメモリ空間</li> +<li>ノーマルレベルでの書き換えやアクセスを防ぐために存在</li> +</ul><hr><h1 id="Xv6" style=""><a class="anchor hidden-xs" href="#Xv6" title="Xv6"><span class="octicon octicon-link"></span></a>Xv6</h1><ul> <li>MIT の講義用教材として作られたOS <ul> -<li>企画課される前のCで書かれたUNIX V6 を書き換えた</li> +<li>規格化される前のCで書かれたUNIX V6 を書き換えた</li> <li>1万行程の軽量なOS</li> <li>Linuxだと数千万行</li> </ul> </li> -<li>Xv6 を参考に CbC で書き直すことで Gears OS を実装する</li> +<li>Xv6 をCbCで書き換える</li> +</ul><hr><h1 id="Xv6の構成" style=""><a class="anchor hidden-xs" href="#Xv6の構成" title="Xv6の構成"><span class="octicon octicon-link"></span></a>Xv6の構成</h1><ul class="highlight"> +<li>systemcall</li> +<li>Scheduler</li> +<li>Virtual Memory</li> +<li>file system</li> +<li>tty</li> </ul><hr><h1 id="カーネル空間" style=""><a class="anchor hidden-xs" href="#カーネル空間" title="カーネル空間"><span class="octicon octicon-link"></span></a>カーネル空間</h1><ul> <li>OS の中核となるプログラムで Meta Level に相当する</li> <li>Xv6 ではカーネルとユーザープログラムは分離されている</li> <li>ユーザープログラムはカーネルに直接アクセスできない。 <ul> -<li>書き換えやアクセスを防ぐため</li> +<li>ユーザープログラムによる書き換えやアクセスを防ぐため</li> <li>呼び出す場合は system call</li> </ul> </li> -</ul><hr><h1 id="カーネルが提供するもの" style=""><a class="anchor hidden-xs" href="#カーネルが提供するもの" title="カーネルが提供するもの"><span class="octicon octicon-link"></span></a>カーネルが提供するもの</h1><ul> -<li>プロセス管理</li> -<li>メモリ管理</li> -<li>ファイル管理 -<ul> -<li>I/O, read, write</li> -</ul> -</li> -</ul><hr><h1 id="カーネルの保護機構" style=""><a class="anchor hidden-xs" href="#カーネルの保護機構" title="カーネルの保護機構"><span class="octicon octicon-link"></span></a>カーネルの保護機構</h1><ul> -<li>CPUのハードウェア保護機構を持っている</li> -<li>ユーザー空間で実行されているプロセスが自身のメモリのみアクセスできるように保護</li> -<li>system call -<ul> -<li>ハードウェアが一時的に特権レベルをあげ、カーネルのプログラムが実行される</li> -</ul> -</li> </ul><hr><h1 id="system-call" style=""><a class="anchor hidden-xs" href="#system-call" title="system-call"><span class="octicon octicon-link"></span></a>system call</h1><ul> <li>system call 呼び出し</li> <li>トラップ の発生</li> <li>ユーザープログラムの中断</li> <li>処理がカーネルに切り替わる</li> -</ul><hr><h1 id="system-call1" style=""><a class="anchor hidden-xs" href="#system-call1" title="system-call1"><span class="octicon octicon-link"></span></a>system call</h1><ul> -<li>ソースコード載せる</li> -</ul><hr><h1 id="Xv6-rpi" style=""><a class="anchor hidden-xs" href="#Xv6-rpi" title="Xv6-rpi"><span class="octicon octicon-link"></span></a>Xv6-rpi</h1><ul> -<li>Xv6 は Arm のバイナリを出力するので様々なハードウェアで動かすことができる -<ul> -<li>Raspberry Pi</li> -<li>携帯電話</li> -</ul> -</li> -<li>実際にRaspberry Pi で動かすために xv6-rpi を用意して動作しているかコンソールで確認中 -<ul> -<li>CbCxv6 とは別</li> -</ul> -</li> -</ul><hr><h1 id="目次3" style=""><a class="anchor hidden-xs" href="#目次3" title="目次3"><span class="octicon octicon-link"></span></a>目次</h1><ol> -<li>OS の信頼性の保証</li> -<li>CbC による Gears OS の開発</li> -<li>Xv6</li> -<li><strong>CbCXv6 での Paging</strong></li> -<li>CbC インターフェース</li> -<li>評価</li> -<li>まとめ</li> -</ol><hr><h1 id="CbCXv6-での-Paging" style=""><a class="anchor hidden-xs" href="#CbCXv6-での-Paging" title="CbCXv6-での-Paging"><span class="octicon octicon-link"></span></a>CbCXv6 での Paging</h1><ul> -<li>OS の信頼性の1つであるメモリ管理部分の書き換えについて説明</li> -</ul><hr><h1 id="実メモリの直接操作" style=""><a class="anchor hidden-xs" href="#実メモリの直接操作" title="実メモリの直接操作"><span class="octicon octicon-link"></span></a>実メモリの直接操作</h1><ul> -<li>実メモリを直接扱うと様々な問題が生じる -<ul> -<li>ユーザープログラムで空いているメモリ番地を探す必要</li> -<li>フラグメンテーションが起こる -<ul> -<li>メモリ間に扱うには小さな隙間ができる</li> -</ul> -</li> -</ul> -</li> </ul><hr><h1 id="Paging" style=""><a class="anchor hidden-xs" href="#Paging" title="Paging"><span class="octicon octicon-link"></span></a>Paging</h1><ul> -<li>メモリ管理の手法</li> <li>Page と呼ばれる固定長のブロックに分割して、メモリとスワップ領域で Page を入れ替えて管理</li> <li>仮想メモリとして扱うことでフラグメンテーションの解消と空き番地を探す必要がなくなる</li> -</ul><hr><h1 id="Pagingの図" style=""><a class="anchor hidden-xs" href="#Pagingの図" title="Pagingの図"><span class="octicon octicon-link"></span></a>Pagingの図</h1><ul> -<li>必要?</li> -</ul><hr><h1 id="メタレベルでの-Paging-の操作" style=""><a class="anchor hidden-xs" href="#メタレベルでの-Paging-の操作" title="メタレベルでの-Paging-の操作"><span class="octicon octicon-link"></span></a>メタレベルでの Paging の操作</h1><ul> -<li>Page Table に相当するデータを Input Data Gear で受け取って変更した後、Context にある Meta Data Gear に goto で遷移してアクセス</li> -<li>メタレベルで処理することで本来カーネル側の処理である Page Table を操作できる</li> -</ul><hr><h1 id="Paging-の信頼性" style=""><a class="anchor hidden-xs" href="#Paging-の信頼性" title="Paging-の信頼性"><span class="octicon octicon-link"></span></a>Paging の信頼性</h1><ul> -<li>Input Data Gear に対しての Output Data Gear をバリデーションチェックすることで他のプロセスから書き換えられることを防ぐ</li> -<li>サンドボックス +</ul><hr><h1 id="Xv6の書き換え方針" style=""><a class="anchor hidden-xs" href="#Xv6の書き換え方針" title="Xv6の書き換え方針"><span class="octicon octicon-link"></span></a>Xv6の書き換え方針</h1><ul> +<li> +<p>メタレベルとノーマルレベルを記述できるOSを実装したい</p> +</li> +<li> +<p>段階的に書き換えていきたい</p> +</li> +<li> +<p>Paging を書き換える理由</p> <ul> -<li>他のプロセスから書き換えられた時にエクセプションを飛ばす</li> +<li>OS の信頼性を保証する上で重要なメモリ管理部分</li> +</ul> +</li> +<li> +<p>__code で書き直していく</p> +</li> +</ul><hr><h1 id="CbCインターフェース0" style=""><a class="anchor hidden-xs" href="#CbCインターフェース0" title="CbCインターフェース0"><span class="octicon octicon-link"></span></a>CbCインターフェース</h1><ul> +<li> +<p>ノーマルレベルからメタレベルの記述が記述が煩雑になるためインターフェースを導入</p> +</li> +<li> +<p>インターフェースによる他のメリット</p> +<ul> +<li>煩雑な記述の解消</li> +<li>実装の入れ替え</li> </ul> </li> -</ul><hr><h1 id="Paging-の書き換え" style=""><a class="anchor hidden-xs" href="#Paging-の書き換え" title="Paging-の書き換え"><span class="octicon octicon-link"></span></a>Paging の書き換え</h1><ul> -<li>Xv6 では実メモリから仮想メモリの変換をvm.cで行なっている。</li> -<li>次の章で書き換えについて説明する</li> -</ul><hr><h1 id="目次4" style=""><a class="anchor hidden-xs" href="#目次4" title="目次4"><span class="octicon octicon-link"></span></a>目次</h1><ol> -<li>OS の信頼性の保証</li> -<li>CbC による Gears OS の開発</li> -<li>Xv6</li> -<li>CbCXv6 での Paging</li> -<li><strong>CbC インターフェース</strong></li> -<li>評価</li> -<li>まとめ</li> -</ol><hr><h1 id="CbC-インターフェースの導入" style=""><a class="anchor hidden-xs" href="#CbC-インターフェースの導入" title="CbC-インターフェースの導入"><span class="octicon octicon-link"></span></a>CbC インターフェースの導入</h1><ul> -<li>継続の記述が煩雑になる +<li> +<p>実装は別で定義し、呼び出す</p> +</li> +<li> +<p>インターフェースによって実装を置き換えることができる</p> +</li> +</ul><hr><h1 id="CbCインターフェース" style=""><a class="anchor hidden-xs" href="#CbCインターフェース" title="CbCインターフェース"><span class="octicon octicon-link"></span></a>CbCインターフェース</h1><ul> +<li> +<p>Data Gear と Data Gear に対して操作を行う Code Gear の集合を表現する <strong>Meta Data Gear</strong></p> +</li> +<li> +<p>インターフェース実装と定義の図入れる</p> +</li> +</ul><hr><h1 id="インターフェースの定義0" style=""><a class="anchor hidden-xs" href="#インターフェースの定義0" title="インターフェースの定義0"><span class="octicon octicon-link"></span></a>インターフェースの定義</h1><ul> +<li>Xv6 の Virtual Memory の API 部分のインターフェース</li> +</ul><pre><code class="c hljs"><span class="token keyword">typedef</span> <span class="token keyword">struct</span> vm<span class="token operator"><</span>Type<span class="token punctuation">,</span>Impl<span class="token operator">></span> <span class="token punctuation">{</span> + __code <span class="token function">init_vmm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + __code <span class="token function">kpt_freerange</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> uint low<span class="token punctuation">,</span> uint hi<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + __code <span class="token function">kpt_alloc</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm <span class="token punctuation">,</span>__code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + __code <span class="token function">switchuvm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm <span class="token punctuation">,</span><span class="token keyword">struct</span> proc<span class="token operator">*</span> p<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + __code <span class="token function">init_inituvm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> init<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + __code <span class="token function">loaduvm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span>pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode<span class="token operator">*</span> ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + __code <span class="token function">allocuvm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> uint oldsz<span class="token punctuation">,</span> uint newsz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + +</code></pre><hr><h1 id="インターフェースの命名" style=""><a class="anchor hidden-xs" href="#インターフェースの命名" title="インターフェースの命名"><span class="octicon octicon-link"></span></a>インターフェースの命名</h1><ul> +<li>typedef struct の直後にインターフェース名(vm)を書く</li> +<li>Data Gear にマッピングされる</li> +</ul><pre><code class="c hljs"><span class="token keyword">typedef</span> <span class="token keyword">struct</span> vm<span class="token operator"><</span>Type<span class="token punctuation">,</span>Impl<span class="token operator">></span> <span class="token punctuation">{</span> +</code></pre><hr><h1 id="インターフェースの-Code-Gear" style=""><a class="anchor hidden-xs" href="#インターフェースの-Code-Gear" title="インターフェースの-Code-Gear"><span class="octicon octicon-link"></span></a>インターフェースの Code Gear</h1><ul> +<li>Code Gear は __code CodeGear名(引数); で記述する <ul> -<li>Code Gear がどの Data Gear の番号に対応するか指定する必要がある</li> -<li>ノーマルレベルとメタレベルで Data Gear の見え方が異なるため調整する必要がある</li> +<li>引数が Data Gear に相当する</li> </ul> </li> -<li>->インターフェースの導入</li> -</ul><hr><h1 id="CbC-インターフェース" style=""><a class="anchor hidden-xs" href="#CbC-インターフェース" title="CbC-インターフェース"><span class="octicon octicon-link"></span></a>CbC インターフェース</h1><ul> -<li>インターフェースは Data Gear に対しての操作を行う Code Gear</li> -<li>実装は別で定義し、呼び出す</li> -<li>インターフェースによって機能を置き換えることができる</li> -</ul><hr><h1 id="インターフェースの定義" style=""><a class="anchor hidden-xs" href="#インターフェースの定義" title="インターフェースの定義"><span class="octicon octicon-link"></span></a>インターフェースの定義</h1><ul> -<li>Data Gear と Data Gear に対して操作を行う Code Gear の集合を表現する <strong>Meta Data Gear</strong></li> -</ul><hr><h1 id="インターフェースのソースコード" style=""><a class="anchor hidden-xs" href="#インターフェースのソースコード" title="インターフェースのソースコード"><span class="octicon octicon-link"></span></a>インターフェースのソースコード</h1><ul> -<li>vm.c をインターフェースで書き換えた vm.h のコードの説明をしていく</li> -</ul><hr><h1 id="実装名の定義" style=""><a class="anchor hidden-xs" href="#実装名の定義" title="実装名の定義"><span class="octicon octicon-link"></span></a>実装名の定義</h1><ul> -<li>typedef struct の直後に実装名(vm)を書く</li> +<li>第1引数の Impl* vm がインターフェースの実装の型になる</li> </ul><pre><code class="c hljs"><span class="token keyword">typedef</span> <span class="token keyword">struct</span> vm<span class="token operator"><</span>Type<span class="token punctuation">,</span>Impl<span class="token operator">></span> <span class="token punctuation">{</span> -</code></pre><hr><h1 id="Data-Gear-の定義" style=""><a class="anchor hidden-xs" href="#Data-Gear-の定義" title="Data-Gear-の定義"><span class="octicon octicon-link"></span></a>Data Gear の定義</h1><ul> -<li>2行目から19行目で引数の Data Gear を定義している</li> -</ul><pre><code class="c hljs"><span class="token keyword">typedef</span> <span class="token keyword">struct</span> vm<span class="token operator"><</span>Type<span class="token punctuation">,</span>Impl<span class="token operator">></span> <span class="token punctuation">{</span> - <span class="token keyword">union</span> Data<span class="token operator">*</span> vm<span class="token punctuation">;</span> - uint low<span class="token punctuation">;</span> - uint hi<span class="token punctuation">;</span> - <span class="token keyword">struct</span> proc<span class="token operator">*</span> p<span class="token punctuation">;</span> -<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> -</code></pre><hr><h1 id="Code-Gear-の定義" style=""><a class="anchor hidden-xs" href="#Code-Gear-の定義" title="Code-Gear-の定義"><span class="octicon octicon-link"></span></a>Code Gear の定義</h1><ul> -<li>Code Gear は __Code CodeGear名(引数); で記述する</li> -<li>第1引数の Impl* vm が Code Gear の型になる</li> -<li>初期化された Data Gear が それぞれの Code Gear の引数として扱われる</li> -<li>例)定義された uinit が kpt_freerange の Code Gear の第1引数と対応している</li> -</ul><pre><code class="c hljs"> __code <span class="token function">init_vmm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + __code <span class="token function">init_vmm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> __code <span class="token function">kpt_freerange</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> uint low<span class="token punctuation">,</span> uint hi<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> __code <span class="token function">kpt_alloc</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm <span class="token punctuation">,</span>__code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> __code <span class="token function">switchuvm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm <span class="token punctuation">,</span><span class="token keyword">struct</span> proc<span class="token operator">*</span> p<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> @@ -310,43 +210,101 @@ __code <span class="token function">loaduvm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span>pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode<span class="token operator">*</span> ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> __code <span class="token function">allocuvm</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> uint oldsz<span class="token punctuation">,</span> uint newsz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> -<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> - </code></pre><hr><h1 id="next…" style=""><a class="anchor hidden-xs" href="#next…" title="next…"><span class="octicon octicon-link"></span></a>next(…)</h1><ul> -<li>__code next(…) は条件分岐によって複数の継続先が設定される</li> +<li>__code next(…) は次の Code Gear の継続先</li> <li>それぞれの Code Gear の引数の1つに設定する</li> </ul><pre><code class="c hljs"> __code <span class="token function">kpt_freerange</span><span class="token punctuation">(</span>Impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> uint low<span class="token punctuation">,</span> uint hi<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> -<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> +<span class="token comment">//....</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> vm<span class="token punctuation">;</span> -</code></pre><hr><h1 id="インターフェースの実装" style=""><a class="anchor hidden-xs" href="#インターフェースの実装" title="インターフェースの実装"><span class="octicon octicon-link"></span></a>インターフェースの実装</h1><ul> -<li>インターフェースの実装は別ファイルで定義する(vm_impl.cbc)</li> -<li>ヘッダーファイルの呼び出しは #include ではなく #interface で呼び出す</li> -</ul><pre><code class="c hljs"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">"../../context.h"</span></span> -<span class="token macro property">#interface "vm.h"</span> +</code></pre><pre><code class="c hljs">__code <span class="token function">exit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> +<span class="token comment">//....</span> +<span class="token punctuation">}</span> -</code></pre><hr><h1 id="create_impl" style=""><a class="anchor hidden-xs" href="#create_impl" title="create_impl"><span class="octicon octicon-link"></span></a>create_impl</h1><ul> -<li>create_imple の関数内で vm の型を定義し、vm->CodeGear名 で対応させていく</li> -<li>実装を Code Gear で記述していく。</li> -</ul><pre><code class="c hljs"> -vm<span class="token operator">*</span> <span class="token function">createvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> Context<span class="token operator">*</span> cbc_context<span class="token punctuation">)</span> <span class="token punctuation">{</span> +<span class="token keyword">goto</span> vm<span class="token operator">-></span><span class="token function">kpt_freerange</span><span class="token punctuation">(</span>vm<span class="token punctuation">,</span> low<span class="token punctuation">,</span> hi<span class="token punctuation">,</span> exit<span class="token punctuation">)</span><span class="token punctuation">;</span> +</code></pre><hr><h1 id="Interface-の実装の型" style=""><a class="anchor hidden-xs" href="#Interface-の実装の型" title="Interface-の実装の型"><span class="octicon octicon-link"></span></a>Interface の実装の型</h1><ul> +<li>実装側のヘッダーファイルも vm_impl と同じように用意する</li> +</ul><pre><code class="c hljs"><span class="token keyword">typedef</span> <span class="token keyword">struct</span> vm_impl<span class="token operator"><</span>Impl<span class="token punctuation">,</span> Isa<span class="token operator">></span> impl vm<span class="token punctuation">{</span> +<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> + __code <span class="token function">loaduvm_ptesize_check</span><span class="token punctuation">(</span>Type<span class="token operator">*</span> vm_impl<span class="token punctuation">,</span> uint i<span class="token punctuation">,</span> pte_t<span class="token operator">*</span> pte<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> +__code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> +</code></pre><hr><h1 id="インターフェースの実装" style=""><a class="anchor hidden-xs" href="#インターフェースの実装" title="インターフェースの実装"><span class="octicon octicon-link"></span></a>インターフェースの実装</h1><ul> +<li>実装は型と実装をそれぞれ別ファイルで定義する(vm_impl.h と vm_impl.cbc)</li> +<li>実装するインターフェースは #interface で宣言する</li> +</ul><pre><code class="c hljs"><span class="token macro property">#interface "vm.h"</span> +</code></pre><hr><h1 class="highlight" id="vm_impl-のコンストラクタ" style=""><a class="anchor hidden-xs" href="#vm_impl-のコンストラクタ" title="vm_impl-のコンストラクタ"><span class="octicon octicon-link"></span></a>vm_impl のコンストラクタ</h1><ul> +<li> +<p>create_imple の関数内で vm の型を定義し、vm->CodeGear名 で対応させていく</p> +</li> +<li> +<p>実装を Code Gear で記述していく。</p> +</li> +<li> +<p>struct vm* vm = new vm();</p> +<ul> +<li>インターフェースのメモリ空間を確保</li> +</ul> +</li> +<li> +<p>vm->void_ret = C_vm_void_ret;</p> +<ul> +<li>Code Gear の enum の設定</li> +<li>インターフェースのAPIと enum の番号を紐付けている</li> +</ul> +</li> +</ul><pre><code class="c hljs">vm<span class="token operator">*</span> <span class="token function">createvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> Context<span class="token operator">*</span> cbc_context<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">struct</span> vm<span class="token operator">*</span> vm <span class="token operator">=</span> new <span class="token function">vm</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> vm<span class="token operator">-></span>void_ret <span class="token operator">=</span> C_vm_void_ret<span class="token punctuation">;</span> vm<span class="token operator">-></span>init_vmm <span class="token operator">=</span> C_init_vmmvm_impl<span class="token punctuation">;</span> vm<span class="token operator">-></span>kpt_freerange <span class="token operator">=</span> C_kpt_freerangevm_impl<span class="token punctuation">;</span> vm<span class="token operator">-></span>kpt_alloc <span class="token operator">=</span> C_kpt_allocvm_impl<span class="token punctuation">;</span> -<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> -__code <span class="token function">init_vmmvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm<span class="token punctuation">,</span>__code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> +</code></pre><ul> +<li>APIの実装の例(init_vmm) +<ul> +<li>C_init_vmmvm_impl が メタレベルでinit_vmmvm_impl と対応する</li> +</ul> +</li> +</ul><pre><code class="c hljs">__code <span class="token function">init_vmmvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm<span class="token punctuation">,</span>__code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">initlock</span><span class="token punctuation">(</span><span class="token operator">&</span>kpt_mem<span class="token punctuation">.</span>lock<span class="token punctuation">,</span> <span class="token string">"vm"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> kpt_mem<span class="token punctuation">.</span>freelist <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span> <span class="token keyword">goto</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> -</code></pre><hr><h1 id="private" style=""><a class="anchor hidden-xs" href="#private" title="private"><span class="octicon octicon-link"></span></a>private</h1><ul> -<li>CbC は信頼性を保証するためにそれぞれの Code Gear を細かくする必要があるので、for文やif文がある場合はさらに実装を分ける</li> -<li>Code Gear は基本的にインターフェースで指定された Code Gear 内からのみ継続さ れるため、Java の private メソッドのように扱われる。</li> +</code></pre><hr><h1 id="インターフェース実装内の-CbC" style=""><a class="anchor hidden-xs" href="#インターフェース実装内の-CbC" title="インターフェース実装内の-CbC"><span class="octicon octicon-link"></span></a>インターフェース実装内の CbC</h1><ul> +<li>for文やif文がある場合はさらに実装を分ける +<ul> +<li>状態遷移ベースで記述したい</li> +</ul> +</li> +<li>インターフェースは外から呼び出されるAPI</li> +<li>それに対してインターフェースの実装の Code Gearから明示的に呼び出される Code Gearは、Java の private メソッドのように扱われる。</li> <li>実際に vm.c の loaduvm の実装を分けた記述を説明する</li> +</ul><hr><h1 id="実装内の明示的な遷移の処理" style=""><a class="anchor hidden-xs" href="#実装内の明示的な遷移の処理" title="実装内の明示的な遷移の処理"><span class="octicon octicon-link"></span></a>実装内の明示的な遷移の処理</h1><ul> +<li>vm と同じ create_impl 内で vm_impl を定義し、private で実装する Code Gear を定義する</li> +<li>loaduvmvm_impl で goto によって private に遷移する</li> +</ul><pre class="highlight"><code class="c hljs">__code <span class="token function">loaduvmvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode<span class="token operator">*</span> ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> + <span class="token function">Gearef</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm_impl<span class="token punctuation">)</span><span class="token operator">-></span>pgdir <span class="token operator">=</span> pgdir<span class="token punctuation">;</span> + <span class="token function">Gearef</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm_impl<span class="token punctuation">)</span><span class="token operator">-></span>addr <span class="token operator">=</span> addr<span class="token punctuation">;</span> + <span class="token function">Gearef</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm_impl<span class="token punctuation">)</span><span class="token operator">-></span>ip <span class="token operator">=</span> ip<span class="token punctuation">;</span> + <span class="token function">Gearef</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm_impl<span class="token punctuation">)</span><span class="token operator">-></span>offset <span class="token operator">=</span> offset<span class="token punctuation">;</span> + <span class="token function">Gearef</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm_impl<span class="token punctuation">)</span><span class="token operator">-></span>sz <span class="token operator">=</span> sz<span class="token punctuation">;</span> + <span class="token function">Gearef</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm_impl<span class="token punctuation">)</span><span class="token operator">-></span>next <span class="token operator">=</span> next<span class="token punctuation">;</span> + + <span class="token keyword">goto</span> <span class="token function">loaduvm_ptesize_checkvm_impl</span><span class="token punctuation">(</span>vm<span class="token punctuation">,</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> +<span class="token punctuation">}</span> +</code></pre><pre class="highlight"><code class="c hljs">vm<span class="token operator">*</span> <span class="token function">createvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> Context<span class="token operator">*</span> cbc_context<span class="token punctuation">)</span> <span class="token punctuation">{</span> +<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> + <span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm_impl <span class="token operator">=</span> new <span class="token function">vm_impl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> +<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> + vm_impl<span class="token operator">-></span>loaduvm_ptesize_check <span class="token operator">=</span> C_loaduvm_ptesize_checkvm_impl<span class="token punctuation">;</span> +<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> + vm<span class="token operator">-></span>loaduvm <span class="token operator">=</span> C_loaduvmvm_impl<span class="token punctuation">;</span> +<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> +<span class="token punctuation">}</span> +</code></pre><hr><h1 id="loaduvmの-CbCによる書き換え" style=""><a class="anchor hidden-xs" href="#loaduvmの-CbCによる書き換え" title="loaduvmの-CbCによる書き換え"><span class="octicon octicon-link"></span></a>loaduvmの CbCによる書き換え</h1><ul> +<li>loaduvmは何でなぜ書き換えてるのか</li> +<li>vm.cのloaduvmの処理をCbC で書き換える</li> </ul><pre><code class="c hljs"><span class="token keyword">int</span> loaduvm <span class="token punctuation">(</span>pde_t <span class="token operator">*</span>pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode <span class="token operator">*</span>ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">)</span> <span class="token punctuation">{</span> uint i<span class="token punctuation">,</span> pa<span class="token punctuation">,</span> n<span class="token punctuation">;</span> @@ -376,20 +334,9 @@ <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> -</code></pre><hr><h1 id="goto-private" style=""><a class="anchor hidden-xs" href="#goto-private" title="goto-private"><span class="octicon octicon-link"></span></a>goto private</h1><ul> -<li>vm と同じ create_impl 内で vm_impl を定義し、private で実装する Code Gear を定義する</li> -<li>loaduvmvm_impl で goto によって private に遷移する</li> -</ul><pre><code class="c hljs">vm<span class="token operator">*</span> <span class="token function">createvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> Context<span class="token operator">*</span> cbc_context<span class="token punctuation">)</span> <span class="token punctuation">{</span> -<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> - <span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm_impl <span class="token operator">=</span> new <span class="token function">vm_impl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> -<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> - vm_impl<span class="token operator">-></span>loaduvm_ptesize_check <span class="token operator">=</span> C_loaduvm_ptesize_checkvm_impl<span class="token punctuation">;</span> -<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> - vm<span class="token operator">-></span>loaduvm <span class="token operator">=</span> C_loaduvmvm_impl<span class="token punctuation">;</span> -<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> -<span class="token punctuation">}</span> - -__code <span class="token function">loaduvmvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode<span class="token operator">*</span> ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> +</code></pre><ul> +<li>loaduvm_impl がインターフェースから呼ばれる実装</li> +</ul><pre><code class="c hljs">__code <span class="token function">loaduvmvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode<span class="token operator">*</span> ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">Gearef</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm_impl<span class="token punctuation">)</span><span class="token operator">-></span>pgdir <span class="token operator">=</span> pgdir<span class="token punctuation">;</span> <span class="token function">Gearef</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm_impl<span class="token punctuation">)</span><span class="token operator">-></span>addr <span class="token operator">=</span> addr<span class="token punctuation">;</span> <span class="token function">Gearef</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm_impl<span class="token punctuation">)</span><span class="token operator">-></span>ip <span class="token operator">=</span> ip<span class="token punctuation">;</span> @@ -399,26 +346,22 @@ <span class="token keyword">goto</span> <span class="token function">loaduvm_ptesize_checkvm_impl</span><span class="token punctuation">(</span>vm<span class="token punctuation">,</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> -</code></pre><hr><h1 id="private-のヘッダー" style=""><a class="anchor hidden-xs" href="#private-のヘッダー" title="private-のヘッダー"><span class="octicon octicon-link"></span></a>private のヘッダー</h1><ul> -<li>private 側のヘッダーファイルも vm_impl と同じように用意する</li> -</ul><pre><code class="c hljs"><span class="token keyword">typedef</span> <span class="token keyword">struct</span> vm_impl<span class="token operator"><</span>Impl<span class="token punctuation">,</span> Isa<span class="token operator">></span> impl vm<span class="token punctuation">{</span> -<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> - __code <span class="token function">loaduvm_ptesize_check</span><span class="token punctuation">(</span>Type<span class="token operator">*</span> vm_impl<span class="token punctuation">,</span> uint i<span class="token punctuation">,</span> pte_t<span class="token operator">*</span> pte<span class="token punctuation">,</span> uint sz<span class="token punctuation">,</span> -__code <span class="token function">next</span><span class="token punctuation">(</span><span class="token keyword">int</span> ret<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> -</code></pre><hr><h1 id="private-の記述" style=""><a class="anchor hidden-xs" href="#private-の記述" title="private-の記述"><span class="octicon octicon-link"></span></a>private の記述</h1><pre><code class="c hljs"><span class="token macro property">#interface "vm_impl.h"</span> +</code></pre><ul> +<li>loaduvm_impl から private な Code Gear が呼ばれる</li> +</ul><pre><code class="c hljs"><span class="token macro property">#interface "vm_impl.h"</span> -__code <span class="token function">loaduvm_ptesize_checkvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm_impl<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token keyword">int</span> ret<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> +__code <span class="token function">loaduvm_ptesize_checkvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm_impl<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">char</span><span class="token operator">*</span> addr <span class="token operator">=</span> vm_impl<span class="token operator">-></span>addr<span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>uint<span class="token punctuation">)</span> addr <span class="token operator">%</span>PTE_SZ <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// goto panic</span> <span class="token punctuation">}</span> - <span class="token keyword">goto</span> <span class="token function">loaduvm_loopvm_impl</span><span class="token punctuation">(</span>vm_impl<span class="token punctuation">,</span> <span class="token function">next</span><span class="token punctuation">(</span>ret<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + <span class="token keyword">goto</span> <span class="token function">loaduvm_loopvm_impl</span><span class="token punctuation">(</span>vm_impl<span class="token punctuation">,</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre><ul> <li>vm.cではここから for だが CbC は if文の中と外にgoto を用意して実装する</li> -</ul><p><img src="https://i.imgur.com/ByA7GVJ.png" alt=""></p><pre><code class="c hljs">__code <span class="token function">loaduvm_loopvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm_impl<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token keyword">int</span> ret<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> +</ul><p><img src="https://i.imgur.com/ByA7GVJ.png" alt=""></p><pre><code class="c hljs">__code <span class="token function">loaduvm_loopvm_impl</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm_impl<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> uint i <span class="token operator">=</span> vm_impl<span class="token operator">-></span>i<span class="token punctuation">;</span> uint sz <span class="token operator">=</span> vm_impl<span class="token operator">-></span>sz<span class="token punctuation">;</span> @@ -426,11 +369,11 @@ <span class="token keyword">goto</span> <span class="token function">loaduvm_check_pgdir</span><span class="token punctuation">(</span>vm_impl<span class="token punctuation">,</span> <span class="token function">next</span><span class="token punctuation">(</span>ret<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> - <span class="token keyword">goto</span> <span class="token function">loaduvm_exit</span><span class="token punctuation">(</span>vm_impl<span class="token punctuation">,</span> <span class="token function">next</span><span class="token punctuation">(</span>ret<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + <span class="token keyword">goto</span> <span class="token function">loaduvm_exit</span><span class="token punctuation">(</span>vm_impl<span class="token punctuation">,</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> -__code <span class="token function">loaduvm_check_pgdir</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm_impl<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token keyword">int</span> ret<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> +__code <span class="token function">loaduvm_check_pgdir</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm_impl<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> pte_t<span class="token operator">*</span> pte <span class="token operator">=</span> vm_impl<span class="token operator">-></span>pte<span class="token punctuation">;</span> pde_t<span class="token operator">*</span> pgdir <span class="token operator">=</span> vm_impl<span class="token operator">-></span>pgdir<span class="token punctuation">;</span> uint i <span class="token operator">=</span> vm_impl<span class="token operator">-></span>i<span class="token punctuation">;</span> @@ -447,17 +390,10 @@ vm_impl<span class="token operator">-></span>addr <span class="token operator">=</span> addr<span class="token punctuation">;</span> vm_impl<span class="token operator">-></span>pa <span class="token operator">=</span> pa<span class="token punctuation">;</span> - <span class="token keyword">goto</span> <span class="token function">loaduvm_check_PTE_SZ</span><span class="token punctuation">(</span>vm_impl<span class="token punctuation">,</span> <span class="token function">next</span><span class="token punctuation">(</span>ret<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> + <span class="token keyword">goto</span> <span class="token function">loaduvm_check_PTE_SZ</span><span class="token punctuation">(</span>vm_impl<span class="token punctuation">,</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> __code <span class="token function">loaduvm_check_PTE_SZ</span><span class="token punctuation">(</span><span class="token keyword">struct</span> vm_impl<span class="token operator">*</span> vm_impl<span class="token punctuation">,</span> __code <span class="token function">next</span><span class="token punctuation">(</span><span class="token keyword">int</span> ret<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> - uint sz <span class="token operator">=</span> vm_impl<span class="token operator">-></span>sz<span class="token punctuation">;</span> - uint i <span class="token operator">=</span> vm_impl<span class="token operator">-></span>i<span class="token punctuation">;</span> - uint n <span class="token operator">=</span> vm_impl<span class="token operator">-></span>n<span class="token punctuation">;</span> - <span class="token keyword">struct</span> inode<span class="token operator">*</span> ip <span class="token operator">=</span> vm_impl<span class="token operator">-></span>ip<span class="token punctuation">;</span> - uint pa <span class="token operator">=</span> vm_impl<span class="token operator">-></span>pa<span class="token punctuation">;</span> - uint offset <span class="token operator">=</span> vm_impl<span class="token operator">-></span>offset<span class="token punctuation">;</span> - <span class="token keyword">if</span> <span class="token punctuation">(</span>sz <span class="token operator">-</span> i <span class="token operator"><</span> PTE_SZ<span class="token punctuation">)</span> <span class="token punctuation">{</span> n <span class="token operator">=</span> sz <span class="token operator">-</span> i<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> @@ -478,7 +414,7 @@ ret <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">goto</span> <span class="token function">next</span><span class="token punctuation">(</span>ret<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> -</code></pre><pre><code class="c hljs"> +</code></pre><hr><pre><code class="c hljs"> <span class="token keyword">int</span> loaduvm <span class="token punctuation">(</span>pde_t <span class="token operator">*</span>pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token operator">*</span>addr<span class="token punctuation">,</span> <span class="token keyword">struct</span> inode <span class="token operator">*</span>ip<span class="token punctuation">,</span> uint offset<span class="token punctuation">,</span> uint sz<span class="token punctuation">)</span> <span class="token punctuation">{</span> uint i<span class="token punctuation">,</span> pa<span class="token punctuation">,</span> n<span class="token punctuation">;</span> @@ -508,42 +444,17 @@ <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> -</code></pre><h1 id="インターフェースの呼び出し" style=""><a class="anchor hidden-xs" href="#インターフェースの呼び出し" title="インターフェースの呼び出し"><span class="octicon octicon-link"></span></a>インターフェースの呼び出し</h1><ul> -<li>定義したインターフェースの呼び出しについて説明する</li> +</code></pre><hr><h1 id="stub" style=""><a class="anchor hidden-xs" href="#stub" title="stub"><span class="octicon octicon-link"></span></a>stub</h1><ul> +<li>goto meta はstub を呼び込んでいる</li> +<li>説明</li> +</ul><hr><h1 id="C-を-CbC-に部分的に書き直す手法" style=""><a class="anchor hidden-xs" href="#C-を-CbC-に部分的に書き直す手法" title="C-を-CbC-に部分的に書き直す手法"><span class="octicon octicon-link"></span></a>C を CbC に部分的に書き直す手法</h1><ul> <li>CbC の場合 goto による 遷移を行うので、関数呼び出しのように goto 以降のコードを実行できない</li> <li>例) goto すると戻ってこれないため それ以降が実行されなくなる。</li> -</ul><pre><code class="c hljs"><span class="token keyword">void</span> <span class="token function">userinit</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> -<span class="token punctuation">{</span> - <span class="token keyword">struct</span> proc<span class="token operator">*</span> p<span class="token punctuation">;</span> - <span class="token keyword">extern</span> <span class="token keyword">char</span> _binary_initcode_start<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span> _binary_initcode_size<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> - - p <span class="token operator">=</span> <span class="token function">allocproc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> - <span class="token function">initContext</span><span class="token punctuation">(</span><span class="token operator">&</span>p<span class="token operator">-></span>cbc_context<span class="token punctuation">)</span><span class="token punctuation">;</span> - - initproc <span class="token operator">=</span> p<span class="token punctuation">;</span> - - <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token punctuation">(</span>p<span class="token operator">-></span>pgdir <span class="token operator">=</span> <span class="token function">kpt_alloc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> - <span class="token function">panic</span><span class="token punctuation">(</span><span class="token string">"userinit: out of memory?"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> - <span class="token punctuation">}</span> - - <span class="token keyword">goto</span> <span class="token function">cbc_init_vmm_dummy</span><span class="token punctuation">(</span><span class="token operator">&</span>p<span class="token operator">-></span>cbc_context<span class="token punctuation">,</span> p<span class="token punctuation">,</span> p<span class="token operator">-></span>pgdir<span class="token punctuation">,</span> _binary_initcode_start<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span>_binary_initcode_size<span class="token punctuation">)</span><span class="token punctuation">;</span> - p<span class="token operator">-></span>sz <span class="token operator">=</span> PTE_SZ<span class="token punctuation">;</span> - - <span class="token comment">// craft the trapframe as if</span> - <span class="token function">memset</span><span class="token punctuation">(</span>p<span class="token operator">-></span>tf<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token operator">*</span>p<span class="token operator">-></span>tf<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> -<span class="token operator">~</span> -</code></pre><h1 id="呼び出しの解決" style=""><a class="anchor hidden-xs" href="#呼び出しの解決" title="呼び出しの解決"><span class="octicon octicon-link"></span></a>呼び出しの解決</h1><ul> +</ul><hr><h1 id="CbC-から-C-への遷移" style=""><a class="anchor hidden-xs" href="#CbC-から-C-への遷移" title="CbC-から-C-への遷移"><span class="octicon octicon-link"></span></a>CbC から C への遷移</h1><ul class="highlight"> <li>最初の命令は next で戻ってこれるので、dummy の関数を用意してそこで実行する</li> -</ul><pre><code class="c hljs"><span class="token keyword">void</span> <span class="token function">dummy</span><span class="token punctuation">(</span><span class="token keyword">struct</span> proc <span class="token operator">*</span>p<span class="token punctuation">,</span> <span class="token keyword">char</span> _binary_initcode_start<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token keyword">char</span> _binary_initcode_size<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> -<span class="token punctuation">{</span> +</ul><pre class="highlight"><code class="c hljs"><span class="token keyword">void</span> <span class="token function">cbc_init_vmm_dummy</span><span class="token punctuation">(</span><span class="token keyword">struct</span> Context<span class="token operator">*</span> cbc_context<span class="token punctuation">,</span> <span class="token keyword">struct</span> proc<span class="token operator">*</span> p<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> init<span class="token punctuation">,</span> uint sz<span class="token punctuation">)</span> +<span class="token punctuation">{</span> <span class="token comment">// inituvm(p->pgdir, _binary_initcode_start, (int)_binary_initcode_size);</span> - <span class="token keyword">goto</span> <span class="token function">cbc_init_vmm_dummy</span><span class="token punctuation">(</span><span class="token operator">&</span>p<span class="token operator">-></span>cbc_context<span class="token punctuation">,</span> p<span class="token punctuation">,</span> p<span class="token operator">-></span>pgdir<span class="token punctuation">,</span> _binary_initcode_start<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span>_binary_initcode_size<span class="token punctuation">)</span><span class="token punctuation">;</span> - -<span class="token punctuation">}</span> - - - -__ncode <span class="token function">cbc_init_vmm_dummy</span><span class="token punctuation">(</span><span class="token keyword">struct</span> Context<span class="token operator">*</span> cbc_context<span class="token punctuation">,</span> <span class="token keyword">struct</span> proc<span class="token operator">*</span> p<span class="token punctuation">,</span> pde_t<span class="token operator">*</span> pgdir<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> init<span class="token punctuation">,</span> uint sz<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment">//:skip</span> <span class="token keyword">struct</span> vm<span class="token operator">*</span> vm <span class="token operator">=</span> <span class="token function">createvm_impl</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// goto vm->init_vmm(vm, pgdir, init, sz , vm->void_ret);</span> @@ -555,7 +466,6 @@ <span class="token keyword">goto</span> <span class="token function">meta</span><span class="token punctuation">(</span>cbc_context<span class="token punctuation">,</span> vm<span class="token operator">-></span>init_inituvm<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> - <span class="token keyword">void</span> <span class="token function">userinit</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">struct</span> proc<span class="token operator">*</span> p<span class="token punctuation">;</span> @@ -570,10 +480,9 @@ <span class="token function">panic</span><span class="token punctuation">(</span><span class="token string">"userinit: out of memory?"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> - <span class="token function">dummy</span><span class="token punctuation">(</span>p<span class="token punctuation">,</span> _binary_initcode_start<span class="token punctuation">,</span> _binary_initcode_size<span class="token punctuation">)</span><span class="token punctuation">;</span> -<span class="token operator">~</span> + <span class="token function">cbc_init_vmm_dummy</span><span class="token punctuation">(</span><span class="token operator">&</span>p<span class="token operator">-></span>cbc_context<span class="token punctuation">,</span> p<span class="token punctuation">,</span> p<span class="token operator">-></span>pgdir<span class="token punctuation">,</span> _binary_initcode_start<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span>_binary_initcode_size<span class="token punctuation">)</span><span class="token punctuation">;</span> -</code></pre></div> +</code></pre><hr><h1 id="まとめ" style=""><a class="anchor hidden-xs" href="#まとめ" title="まとめ"><span class="octicon octicon-link"></span></a>まとめ</h1></div> <div class="ui-toc dropup unselectable hidden-print" style="display:none;"> <div class="pull-right dropdown"> <a id="tocLabel" class="ui-toc-label btn btn-default" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false" title="Table of content"> @@ -582,56 +491,36 @@ <ul id="ui-toc" class="ui-toc-dropdown dropdown-menu" aria-labelledby="tocLabel"> <div class="toc"><ul class="nav"> <li class=""><a href="#CbCインターフェースによる-CbCXv6-の書き換え" title="CbCインターフェースによる CbCXv6 の書き換え">CbCインターフェースによる CbCXv6 の書き換え</a></li> -<li><a href="#目次" title="目次">目次</a></li> -<li><a href="#OS-の信頼性の重要性" title="OS の信頼性の重要性">OS の信頼性の重要性</a></li> -<li><a href="#OS-の信頼性の重要性1" title="OS の信頼性の重要性">OS の信頼性の重要性</a></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="#goto-による継続" title="goto による継続">goto による継続</a></li> -<li><a href="#Data-Gear-の継続" title="Data Gear の継続">Data Gear の継続</a></li> -<li><a href="#Meta-Code-Gear" title="Meta Code Gear">Meta Code Gear</a></li> -<li><a href="#状態遷移モデル" title="状態遷移モデル">状態遷移モデル</a></li> -<li><a href="#Agda-による検証" title="Agda による検証">Agda による検証</a></li> -<li><a href="#Haure-Logic" title="Haure Logic">Haure Logic</a></li> -<li><a href="#Geas-OS" title="Geas OS">Geas OS</a></li> -<li><a href="#メモリ管理" title="メモリ管理">メモリ管理</a></li> -<li><a href="#インターフェース" title="インターフェース">インターフェース</a></li> -<li><a href="#目次1" title="目次">目次</a></li> -<li><a href="#CbC-による-Gears-OS-の開発" title="CbC による Gears OS の開発">CbC による Gears OS の開発</a></li> -<li><a href="#Context" title="Context">Context</a></li> -<li><a href="#目次2" title="目次">目次</a></li> -<li><a href="#Xv6" title="Xv6">Xv6</a></li> -<li><a href="#カーネル空間" title="カーネル空間">カーネル空間</a></li> -<li><a href="#カーネルが提供するもの" title="カーネルが提供するもの">カーネルが提供するもの</a></li> -<li><a href="#カーネルの保護機構" title="カーネルの保護機構">カーネルの保護機構</a></li> -<li><a href="#system-call" title="system call">system call</a></li> -<li><a href="#system-call1" title="system call">system call</a></li> -<li><a href="#Xv6-rpi" title="Xv6-rpi">Xv6-rpi</a></li> -<li><a href="#目次3" title="目次">目次</a></li> -<li><a href="#CbCXv6-での-Paging" title="CbCXv6 での Paging">CbCXv6 での Paging</a></li> -<li><a href="#実メモリの直接操作" title="実メモリの直接操作">実メモリの直接操作</a></li> -<li><a href="#Paging" title="Paging">Paging</a></li> -<li><a href="#Pagingの図" title="Pagingの図">Pagingの図</a></li> -<li><a href="#メタレベルでの-Paging-の操作" title="メタレベルでの Paging の操作">メタレベルでの Paging の操作</a></li> -<li><a href="#Paging-の信頼性" title="Paging の信頼性">Paging の信頼性</a></li> -<li><a href="#Paging-の書き換え" title="Paging の書き換え">Paging の書き換え</a></li> -<li><a href="#目次4" title="目次">目次</a></li> -<li><a href="#CbC-インターフェースの導入" title="CbC インターフェースの導入">CbC インターフェースの導入</a></li> -<li><a href="#CbC-インターフェース" title="CbC インターフェース">CbC インターフェース</a></li> -<li><a href="#インターフェースの定義" title="インターフェースの定義">インターフェースの定義</a></li> -<li><a href="#インターフェースのソースコード" title="インターフェースのソースコード">インターフェースのソースコード</a></li> -<li><a href="#実装名の定義" title="実装名の定義">実装名の定義</a></li> -<li><a href="#Data-Gear-の定義" title="Data Gear の定義">Data Gear の定義</a></li> -<li><a href="#Code-Gear-の定義" title="Code Gear の定義">Code Gear の定義</a></li> +<li class=""><a href="#概要" title="概要">概要</a></li> +<li class=""><a href="#OS-の信頼性を上げたい" title="OS の信頼性を上げたい">OS の信頼性を上げたい</a></li> +<li class=""><a href="#メタレベルとノーマルレベル" title="メタレベルとノーマルレベル">メタレベルとノーマルレベル</a></li> +<li class=""><a href="#Continuation-based-C" title="Continuation based C">Continuation based C</a></li> +<li class=""><a href="#goto-による継続" title="goto による継続">goto による継続</a></li> +<li class=""><a href="#Data-Gear-の継続" title="Data Gear の継続">Data Gear の継続</a></li> +<li class=""><a href="#Meta-Code-Gear" title="Meta Code Gear">Meta Code Gear</a></li> +<li class=""><a href="#Meta-Data-Gear" title="Meta Data Gear">Meta Data Gear</a></li> +<li class=""><a href="#Xv6" title="Xv6">Xv6</a></li> +<li class=""><a href="#Xv6の構成" title="Xv6の構成">Xv6の構成</a></li> +<li class=""><a href="#カーネル空間" title="カーネル空間">カーネル空間</a></li> +<li class=""><a href="#system-call" title="system call">system call</a></li> +<li class=""><a href="#Paging" title="Paging">Paging</a></li> +<li class=""><a href="#Xv6の書き換え方針" title="Xv6の書き換え方針">Xv6の書き換え方針</a></li> +<li class=""><a href="#CbCインターフェース0" title="CbCインターフェース">CbCインターフェース</a></li> +<li class=""><a href="#CbCインターフェース" title="CbCインターフェース">CbCインターフェース</a></li> +<li class=""><a href="#インターフェースの定義0" title="インターフェースの定義">インターフェースの定義</a></li> +<li><a href="#インターフェースの命名" title="インターフェースの命名">インターフェースの命名</a></li> +<li><a href="#インターフェースの-Code-Gear" title="インターフェースの Code Gear">インターフェースの Code Gear</a></li> <li><a href="#next…" title="next(…)">next(…)</a></li> +<li><a href="#Interface-の実装の型" title="Interface の実装の型">Interface の実装の型</a></li> <li><a href="#インターフェースの実装" title="インターフェースの実装">インターフェースの実装</a></li> -<li><a href="#create_impl" title="create_impl">create_impl</a></li> -<li><a href="#private" title="private">private</a></li> -<li><a href="#goto-private" title="goto private">goto private</a></li> -<li><a href="#private-のヘッダー" title="private のヘッダー">private のヘッダー</a></li> -<li class=""><a href="#private-の記述" title="private の記述">private の記述</a></li> -<li class=""><a href="#インターフェースの呼び出し" title="インターフェースの呼び出し">インターフェースの呼び出し</a></li> -<li class=""><a href="#呼び出しの解決" title="呼び出しの解決">呼び出しの解決</a></li> +<li><a href="#vm_impl-のコンストラクタ" title="vm_impl のコンストラクタ">vm_impl のコンストラクタ</a></li> +<li class=""><a href="#インターフェース実装内の-CbC" title="インターフェース実装内の CbC">インターフェース実装内の CbC</a></li> +<li><a href="#実装内の明示的な遷移の処理" title="実装内の明示的な遷移の処理">実装内の明示的な遷移の処理</a></li> +<li><a href="#loaduvmの-CbCによる書き換え" title="loaduvmの CbCによる書き換え">loaduvmの CbCによる書き換え</a></li> +<li><a href="#stub" title="stub">stub</a></li> +<li><a href="#C-を-CbC-に部分的に書き直す手法" title="C を CbC に部分的に書き直す手法">C を CbC に部分的に書き直す手法</a></li> +<li><a href="#CbC-から-C-への遷移" title="CbC から C への遷移">CbC から C への遷移</a></li> +<li><a href="#まとめ" title="まとめ">まとめ</a></li> </ul> </div><div class="toc-menu"><a class="expand-toggle" href="#">Expand all</a><a class="back-to-top" href="#">Back to top</a><a class="go-to-bottom" href="#">Go to bottom</a></div> </ul> @@ -640,56 +529,36 @@ <div id="ui-toc-affix" class="ui-affix-toc ui-toc-dropdown unselectable hidden-print" data-spy="affix" style="top:17px;display:none;" null null> <div class="toc"><ul class="nav"> <li class=""><a href="#CbCインターフェースによる-CbCXv6-の書き換え" title="CbCインターフェースによる CbCXv6 の書き換え">CbCインターフェースによる CbCXv6 の書き換え</a></li> -<li><a href="#目次" title="目次">目次</a></li> -<li><a href="#OS-の信頼性の重要性" title="OS の信頼性の重要性">OS の信頼性の重要性</a></li> -<li><a href="#OS-の信頼性の重要性1" title="OS の信頼性の重要性">OS の信頼性の重要性</a></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="#goto-による継続" title="goto による継続">goto による継続</a></li> -<li><a href="#Data-Gear-の継続" title="Data Gear の継続">Data Gear の継続</a></li> -<li><a href="#Meta-Code-Gear" title="Meta Code Gear">Meta Code Gear</a></li> -<li><a href="#状態遷移モデル" title="状態遷移モデル">状態遷移モデル</a></li> -<li><a href="#Agda-による検証" title="Agda による検証">Agda による検証</a></li> -<li><a href="#Haure-Logic" title="Haure Logic">Haure Logic</a></li> -<li><a href="#Geas-OS" title="Geas OS">Geas OS</a></li> -<li><a href="#メモリ管理" title="メモリ管理">メモリ管理</a></li> -<li><a href="#インターフェース" title="インターフェース">インターフェース</a></li> -<li><a href="#目次1" title="目次">目次</a></li> -<li><a href="#CbC-による-Gears-OS-の開発" title="CbC による Gears OS の開発">CbC による Gears OS の開発</a></li> -<li><a href="#Context" title="Context">Context</a></li> -<li><a href="#目次2" title="目次">目次</a></li> -<li><a href="#Xv6" title="Xv6">Xv6</a></li> -<li><a href="#カーネル空間" title="カーネル空間">カーネル空間</a></li> -<li><a href="#カーネルが提供するもの" title="カーネルが提供するもの">カーネルが提供するもの</a></li> -<li><a href="#カーネルの保護機構" title="カーネルの保護機構">カーネルの保護機構</a></li> -<li><a href="#system-call" title="system call">system call</a></li> -<li><a href="#system-call1" title="system call">system call</a></li> -<li><a href="#Xv6-rpi" title="Xv6-rpi">Xv6-rpi</a></li> -<li><a href="#目次3" title="目次">目次</a></li> -<li><a href="#CbCXv6-での-Paging" title="CbCXv6 での Paging">CbCXv6 での Paging</a></li> -<li><a href="#実メモリの直接操作" title="実メモリの直接操作">実メモリの直接操作</a></li> -<li><a href="#Paging" title="Paging">Paging</a></li> -<li><a href="#Pagingの図" title="Pagingの図">Pagingの図</a></li> -<li><a href="#メタレベルでの-Paging-の操作" title="メタレベルでの Paging の操作">メタレベルでの Paging の操作</a></li> -<li><a href="#Paging-の信頼性" title="Paging の信頼性">Paging の信頼性</a></li> -<li><a href="#Paging-の書き換え" title="Paging の書き換え">Paging の書き換え</a></li> -<li><a href="#目次4" title="目次">目次</a></li> -<li><a href="#CbC-インターフェースの導入" title="CbC インターフェースの導入">CbC インターフェースの導入</a></li> -<li><a href="#CbC-インターフェース" title="CbC インターフェース">CbC インターフェース</a></li> -<li><a href="#インターフェースの定義" title="インターフェースの定義">インターフェースの定義</a></li> -<li><a href="#インターフェースのソースコード" title="インターフェースのソースコード">インターフェースのソースコード</a></li> -<li><a href="#実装名の定義" title="実装名の定義">実装名の定義</a></li> -<li><a href="#Data-Gear-の定義" title="Data Gear の定義">Data Gear の定義</a></li> -<li><a href="#Code-Gear-の定義" title="Code Gear の定義">Code Gear の定義</a></li> +<li class=""><a href="#概要" title="概要">概要</a></li> +<li class=""><a href="#OS-の信頼性を上げたい" title="OS の信頼性を上げたい">OS の信頼性を上げたい</a></li> +<li class=""><a href="#メタレベルとノーマルレベル" title="メタレベルとノーマルレベル">メタレベルとノーマルレベル</a></li> +<li class=""><a href="#Continuation-based-C" title="Continuation based C">Continuation based C</a></li> +<li class=""><a href="#goto-による継続" title="goto による継続">goto による継続</a></li> +<li class=""><a href="#Data-Gear-の継続" title="Data Gear の継続">Data Gear の継続</a></li> +<li class=""><a href="#Meta-Code-Gear" title="Meta Code Gear">Meta Code Gear</a></li> +<li class=""><a href="#Meta-Data-Gear" title="Meta Data Gear">Meta Data Gear</a></li> +<li class=""><a href="#Xv6" title="Xv6">Xv6</a></li> +<li class=""><a href="#Xv6の構成" title="Xv6の構成">Xv6の構成</a></li> +<li class=""><a href="#カーネル空間" title="カーネル空間">カーネル空間</a></li> +<li class=""><a href="#system-call" title="system call">system call</a></li> +<li class=""><a href="#Paging" title="Paging">Paging</a></li> +<li class=""><a href="#Xv6の書き換え方針" title="Xv6の書き換え方針">Xv6の書き換え方針</a></li> +<li class=""><a href="#CbCインターフェース0" title="CbCインターフェース">CbCインターフェース</a></li> +<li class=""><a href="#CbCインターフェース" title="CbCインターフェース">CbCインターフェース</a></li> +<li class=""><a href="#インターフェースの定義0" title="インターフェースの定義">インターフェースの定義</a></li> +<li><a href="#インターフェースの命名" title="インターフェースの命名">インターフェースの命名</a></li> +<li><a href="#インターフェースの-Code-Gear" title="インターフェースの Code Gear">インターフェースの Code Gear</a></li> <li><a href="#next…" title="next(…)">next(…)</a></li> +<li><a href="#Interface-の実装の型" title="Interface の実装の型">Interface の実装の型</a></li> <li><a href="#インターフェースの実装" title="インターフェースの実装">インターフェースの実装</a></li> -<li><a href="#create_impl" title="create_impl">create_impl</a></li> -<li><a href="#private" title="private">private</a></li> -<li><a href="#goto-private" title="goto private">goto private</a></li> -<li><a href="#private-のヘッダー" title="private のヘッダー">private のヘッダー</a></li> -<li class=""><a href="#private-の記述" title="private の記述">private の記述</a></li> -<li class=""><a href="#インターフェースの呼び出し" title="インターフェースの呼び出し">インターフェースの呼び出し</a></li> -<li class=""><a href="#呼び出しの解決" title="呼び出しの解決">呼び出しの解決</a></li> +<li><a href="#vm_impl-のコンストラクタ" title="vm_impl のコンストラクタ">vm_impl のコンストラクタ</a></li> +<li class=""><a href="#インターフェース実装内の-CbC" title="インターフェース実装内の CbC">インターフェース実装内の CbC</a></li> +<li><a href="#実装内の明示的な遷移の処理" title="実装内の明示的な遷移の処理">実装内の明示的な遷移の処理</a></li> +<li><a href="#loaduvmの-CbCによる書き換え" title="loaduvmの CbCによる書き換え">loaduvmの CbCによる書き換え</a></li> +<li><a href="#stub" title="stub">stub</a></li> +<li><a href="#C-を-CbC-に部分的に書き直す手法" title="C を CbC に部分的に書き直す手法">C を CbC に部分的に書き直す手法</a></li> +<li><a href="#CbC-から-C-への遷移" title="CbC から C への遷移">CbC から C への遷移</a></li> +<li><a href="#まとめ" title="まとめ">まとめ</a></li> </ul> </div><div class="toc-menu"><a class="expand-toggle" href="#">Expand all</a><a class="back-to-top" href="#">Back to top</a><a class="go-to-bottom" href="#">Go to bottom</a></div> </div>