changeset 60:ecf9d73f18f5

update
author mir3636
date Wed, 13 Feb 2019 15:15:59 +0900
parents 09c168f8116a
children 1082a5702d46
files paper/evaluation.tex slide/slide.html slide/slide.md
diffstat 3 files changed, 621 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/paper/evaluation.tex	Wed Feb 13 09:47:53 2019 +0900
+++ b/paper/evaluation.tex	Wed Feb 13 15:15:59 2019 +0900
@@ -9,7 +9,7 @@
 Gears OS の モジュール化について評価を行う。
 モジュール化されていない以前の Gears OS ではソースコード \ref{prevgear} 4行目のように、
 Code Gear 直接指定しなければならなかった。
-Interface を用いた ソースコード \ref{intergear} ではここを stack->push のように抽象化することができる。
+Interface を用いた ソースコード \ref{intergear} ではここを stack$->$push のように抽象化することができる。
 
 また、Gears OS では、ある Data Gear を Code Gear が扱う場合、
 Code Gear に対応する Data Gear を Context が持つ Data Gear のリストから取り出す必要があるが、
--- a/slide/slide.html	Wed Feb 13 09:47:53 2019 +0900
+++ b/slide/slide.html	Wed Feb 13 15:15:59 2019 +0900
@@ -2,7 +2,7 @@
 <html>
 <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
-   <title>継続を基本とした言語による OS のモジュール化</title>
+   <title>継続を基本とした言語による<br> OS のモジュール化</title>
 
 <meta name="generator" content="Slide Show (S9) v2.5.0 on Ruby 2.4.0 (2016-12-24) [x86_64-darwin16]">
 <meta name="author"    content="宮城 光希" >
@@ -66,7 +66,7 @@
       <tr>
         <td>
           <div align="center">
-            <h1><font color="#808db5">継続を基本とした言語による OS のモジュール化</font></h1>
+            <h1><font color="#808db5">継続を基本とした言語による<br> OS のモジュール化</font></h1>
           </div>
         </td>
       </tr>
@@ -86,7 +86,7 @@
 <!-- === begin markdown block ===
 
       generated by markdown/1.2.0 on Ruby 2.4.0 (2016-12-24) [x86_64-darwin16]
-                on 2019-02-13 08:59:24 +0900 with Markdown engine kramdown (1.16.2)
+                on 2019-02-13 13:28:13 +0900 with Markdown engine kramdown (1.16.2)
                   using options {}
   -->
 
@@ -175,6 +175,31 @@
 </div>
 <div class='slide '>
 <!-- _S9SLIDE_ -->
+<h2 id="section-2">目次</h2>
+<ul>
+  <li>今回の研究発表は大きく分けて 2部の構成となっている。</li>
+  <li>第1部では Gears OS のモジュール化の仕組みの導入と解説。</li>
+  <li>第2部では xv6 の CbC による書き換え について発表する。</li>
+</ul>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 id="section-3">目次</h2>
+<ul>
+  <li><strong>Code Gear と Data Gear</strong></li>
+  <li>Gears OS におけるメタ計算</li>
+  <li>Context</li>
+  <li>Meta Code Gear</li>
+  <li>Interface</li>
+  <li>Interface 導入についての評価</li>
+</ul>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
 <h2 id="cbc-">CbC のコード例</h2>
 <ul>
   <li>Code Gear は__code Code Gear 名 (引数) の形で記述される。</li>
@@ -236,6 +261,19 @@
 </div>
 <div class='slide '>
 <!-- _S9SLIDE_ -->
+<h2 id="section-4">目次</h2>
+<ul>
+  <li>Code Gear と Data Gear</li>
+  <li><strong>Gears OS におけるメタ計算</strong></li>
+  <li>Context</li>
+  <li>Meta Code Gear</li>
+  <li>Interface</li>
+</ul>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
 <h2 id="gears-">Gears でのメタ計算</h2>
 <ul>
   <li>Gears OS ではメタ計算を Meta Code/Data Gear で表現する。</li>
@@ -277,6 +315,20 @@
 </div>
 <div class='slide '>
 <!-- _S9SLIDE_ -->
+<h2 id="section-5">目次</h2>
+<ul>
+  <li>Code Gear と Data Gear</li>
+  <li>Gears OS におけるメタ計算</li>
+  <li><strong>Context</strong></li>
+  <li>Meta Code Gear</li>
+  <li>Interface</li>
+  <li>Interface 導入についての評価</li>
+</ul>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
 <h2 id="context">Context</h2>
 <ul>
   <li>Gears OS では Context と呼ばれる、使用されるすべての Code Gear、Data Gear を持つ Meta Data Gear を持っている。</li>
@@ -289,6 +341,17 @@
 <div class='slide '>
 <!-- _S9SLIDE_ -->
 <h2 id="context-1">Context</h2>
+<ul>
+  <li>CbC はポインタを扱えるので、アセンブラ的に書けてしまう。</li>
+  <li>Code Gear は関数型プログラミング的に意味があるように書きたい。</li>
+  <li>Code Gear は入力された型の決まった Data Gear のみ扱えるように Context を利用する。</li>
+</ul>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 id="context-2">Context</h2>
 <ul lang="c">
   <li>Context は全ての Code Gear のリストを持っており、enum で番号とアドレスを対応付けている。</li>
 </ul>
@@ -310,7 +373,7 @@
 </div>
 <div class='slide '>
 <!-- _S9SLIDE_ -->
-<h2 id="context-2">Context</h2>
+<h2 id="context-3">Context</h2>
 <ul lang="c">
   <li>Data Gear も Code Gear と同様に Context が全ての Data Gear のリストを持っている。</li>
   <li>Data Gear のリストも enum で管理されている。</li>
@@ -330,6 +393,20 @@
 </div>
 <div class='slide '>
 <!-- _S9SLIDE_ -->
+<h2 id="section-6">目次</h2>
+<ul>
+  <li>Code Gear と Data Gear</li>
+  <li>Gears OS におけるメタ計算</li>
+  <li>Context</li>
+  <li><strong>Meta Code Gear</strong></li>
+  <li>Interface</li>
+  <li>Interface 導入についての評価</li>
+</ul>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
 <h2 id="stub-code-gear">stub Code Gear</h2>
 <ul lang="c">
   <li>ノーマルレベルの Gears OS では継続先に渡す Data Gear は引数の集合に見える。</li>
@@ -416,6 +493,20 @@
 </div>
 <div class='slide '>
 <!-- _S9SLIDE_ -->
+<h2 id="section-7">目次</h2>
+<ul>
+  <li>Code Gear と Data Gear</li>
+  <li>Gears OS におけるメタ計算</li>
+  <li>Context</li>
+  <li>Meta Code Gear</li>
+  <li><strong>Interface</strong></li>
+  <li>Interface 導入についての評価</li>
+</ul>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
 <h2 id="interface">Interface</h2>
 <ul>
   <li>Interface は Gears OS のモジュール化の仕組みである。</li>
@@ -580,6 +671,85 @@
 </div>
 <div class='slide '>
 <!-- _S9SLIDE_ -->
+<h2 id="section-8">目次</h2>
+<ul>
+  <li>Code Gear と Data Gear</li>
+  <li>Gears OS におけるメタ計算</li>
+  <li>Context</li>
+  <li>Meta Code Gear</li>
+  <li>Interface</li>
+  <li><strong>Interface 導入についての評価</strong></li>
+</ul>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 id="interface--pushstack-">Interface を用いない pushStack の記述</h2>
+<ul>
+  <li>Interface を用いない場合の Code Gear では、完全にメタレベルとノーマルレベルが分離されておらず、
+Code Gear の引数の Data Gear に対応する番号を示さなくてはならなかった。</li>
+  <li>また、継続先も直接指定しなければならなかった。</li>
+</ul>
+
+<pre lang="c"><code>__code cg1 (struct Context* context, struct Element* element) {
+    allocate-&gt;size = sizeof(struct Node);
+    allocator(context);
+    goto meta(context, putSingleLinkedStack)
+}
+
+__code pushSingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, struct Node* node) {
+    ...
+}
+
+__code pushSingleLinkedStack_stub(struct Context* context){
+    SingleLinkedStack* stack = &amp;context-&gt;data[SingleLinkedStack]-&gt;SingleLinkedStack;
+    Node *node = &amp;context-&gt;data[context-&gt;dataNum]-&gt;node;
+    goto pushSingleLinkedStack(context, stack, data);
+}
+</code></pre>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 id="interface--pushstack--1">Interface を用いた pushStack の記述</h2>
+<ul lang="c">
+  <li>Interface を用いることでノーマルレベルとメタレベルが分離され、stub も自動生成されるようになった。</li>
+  <li>継続先も stack-&gt;push となることで、抽象化され、異なる実装にも対応できるようになった。</li>
+</ul>
+<pre><code>__code cg1 (struct Stack* stack) {
+    struct Node* node1 = new Node();
+    goto stack-&gt;push((union Data*)node1,cg2);
+}
+
+__code pushSingleLinkedStack(struct SingleLinkedStack* stack, union Data* data, __code next(...)) {
+    ...
+}
+
+__code pushSingleLinkedStack_stub(struct Context* context){
+    SingleLinkedStack* stack = (SingleLinkedStack*)context-&gt;data[D_Stack]-&gt;Stack.stack-&gt;Stack.stack;
+    Data* data = &amp;context-&gt;data[D_Stack]-&gt;Stack-&gt;data;
+    enum Code next = &amp;context-&gt;data[D_Stack]-&gt;Stack-&gt;next;
+    goto pushSingleLinkedStack(context, stack, data, next);
+}
+</code></pre>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 id="section-9">目次</h2>
+<ul>
+  <li><strong>xv6 の書き換えの方針について</strong></li>
+  <li>cbc_read の実装</li>
+  <li>CbC 書き換えについての評価</li>
+</ul>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
 <h2 id="xv6--cbc--1">xv6 の CbC 書き換え</h2>
 <ul>
   <li>xv6 は UNIX V6 を x86 向けに再実装した OS である。</li>
@@ -603,7 +773,7 @@
 </div>
 <div class='slide '>
 <!-- _S9SLIDE_ -->
-<h2 id="section-2">システムコールの書き換え</h2>
+<h2 id="section-10">システムコールの書き換え</h2>
 <ul>
   <li>CbC は C と互換性のある言語であるため、元のソースコードから大きく崩すことなく必要な機能のみを CbC へと書き換えることが可能である。</li>
   <li>ここでは実際にシステムコールを CbC で書き換えることによって、状態遷移ベースで書き換えるには何が必要か示すことにした。</li>
@@ -614,6 +784,17 @@
 </div>
 <div class='slide '>
 <!-- _S9SLIDE_ -->
+<h2 id="section-11">目次</h2>
+<ul>
+  <li>xv6 の書き換えの方針について</li>
+  <li><strong>cbc_read の実装</strong></li>
+  <li>CbC 書き換えについての評価</li>
+</ul>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
 <h2 id="syscall">syscall関数</h2>
 <ul lang="c">
   <li>syscall 関数 はシステムコールを呼び出す関数である。</li>
@@ -794,6 +975,322 @@
 ...
 </code></pre>
 
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 id="consoleread">consoleread</h2>
+<ul lang="c">
+  <li>console への入力を読み込み、待っている間スリープする</li>
+</ul>
+<pre><code>int consoleread (struct inode *ip, char *dst, int n)
+{
+    uint target;
+    int c;
+    iunlock(ip);
+    target = n;
+    acquire(&amp;input.lock);
+
+    while (n &gt; 0) {
+        while (input.r == input.w) {
+            if (proc-&gt;killed) {
+                release(&amp;input.lock);
+                ilock(ip);
+                return -1;
+            }
+            sleep(&amp;input.r, &amp;input.lock);
+        }
+        c = input.buf[input.r++ % INPUT_BUF];
+        if (c == C('D')) {  // EOF
+            if (n &lt; target) {
+                input.r--;
+            }
+            break;
+        }
+        *dst++ = c;
+        --n;
+        if (c == '\n') {
+            break;
+        }
+    }
+    release(&amp;input.lock);
+    ilock(ip);
+    return target - n;
+}
+</code></pre>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 id="cbcconsoleread">cbc_consoleread</h2>
+
+<pre lang="c"><code>__code cbc_consoleread (struct inode *ip, char *dst, int n, __code(*next)(int ret))
+{   
+    uint target;
+    
+    iunlock(ip);
+    
+    target = n;
+    acquire(&amp;input.lock);
+    
+    if (n &gt; 0) {
+        proc-&gt;cbc_arg.cbc_console_arg.n = n; 
+        proc-&gt;cbc_arg.cbc_console_arg.target = target;
+        proc-&gt;cbc_arg.cbc_console_arg.dst = dst;
+        proc-&gt;cbc_arg.cbc_console_arg.ip = ip;
+        proc-&gt;cbc_arg.cbc_console_arg.next = next;
+        goto cbc_consoleread2();
+    }
+    goto cbc_consoleread1();
+}
+</code></pre>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 lang="c" id="cbcconsoleread-1">cbc_consoleread</h2>
+<pre><code>__code cbc_consoleread2 ()
+{   
+    struct inode *ip = proc-&gt;cbc_arg.cbc_console_arg.ip;
+    __code(*next)(int ret) = proc-&gt;cbc_arg.cbc_console_arg.next;
+    if (input.r == input.w) {
+        if (proc-&gt;killed) {
+            release(&amp;input.lock);
+            ilock(ip);
+            goto next(-1);
+        }
+       goto cbc_sleep(&amp;input.r, &amp;input.lock, cbc_consoleread2);
+    }
+    goto cbc_consoleread1();
+}
+
+__code cbc_consoleread1 ()
+{   
+    int cont = 1;
+    int n = proc-&gt;cbc_arg.cbc_console_arg.n;
+    int target = proc-&gt;cbc_arg.cbc_console_arg.target;
+    char* dst = proc-&gt;cbc_arg.cbc_console_arg.dst;
+    struct inode *ip = proc-&gt;cbc_arg.cbc_console_arg.ip;
+    __code(*next)(int ret) = proc-&gt;cbc_arg.cbc_console_arg.next;
+    
+    int c = input.buf[input.r++ % INPUT_BUF];
+    
+    if (c == C('D')) {  // EOF
+        if (n &lt; target) {
+            input.r--;
+        }
+        cont = 0;
+    }
+    
+    *dst++ = c;
+    --n;
+    if (c == '\n') {
+        cont = 0;
+    }
+    if (cont == 1) {
+        if (n &gt; 0) {
+            proc-&gt;cbc_arg.cbc_console_arg.n = n; 
+            proc-&gt;cbc_arg.cbc_console_arg.target = target;
+            proc-&gt;cbc_arg.cbc_console_arg.dst = dst;
+            proc-&gt;cbc_arg.cbc_console_arg.ip = ip;
+            proc-&gt;cbc_arg.cbc_console_arg.next = next;
+            goto cbc_sleep(&amp;input.r, &amp;input.lock, cbc_consoleread2);
+        }
+    }
+    release(&amp;input.lock);
+    ilock(ip);
+    goto next(target - n);
+}
+</code></pre>
+<p lang="c">## sleep
+- プロセスをスリープ状態にしてスケジューラーへ引き渡す。</p>
+<pre><code>void sleep(void *chan, struct spinlock *lk)
+{
+    if(proc == 0) {
+        panic("sleep");
+    }
+
+    if(lk == 0) {
+        panic("sleep without lk");
+    }
+
+    if(lk != &amp;ptable.lock){  //DOC: sleeplock0
+        acquire(&amp;ptable.lock);  //DOC: sleeplock1
+        release(lk);
+    }
+
+    proc-&gt;chan = chan;
+    proc-&gt;state = SLEEPING;
+    sched();
+
+    proc-&gt;chan = 0;
+
+    if(lk != &amp;ptable.lock){  //DOC: sleeplock2
+        release(&amp;ptable.lock);
+        acquire(lk);
+    }
+}
+</code></pre>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 lang="c" id="cbcsleep">cbc_sleep</h2>
+<pre><code>__code cbc_sleep1()
+{   
+    struct spinlock *lk = proc-&gt;lk;
+    proc-&gt;chan = 0;
+    
+    if(lk != &amp;ptable.lock){  //DOC: sleeplock2
+        release(&amp;ptable.lock);
+        acquire(lk);
+    }
+    goto proc-&gt;cbc_next();
+}
+
+__code cbc_sleep(void *chan, struct spinlock *lk, __code(*next1)())
+{   
+    if(proc == 0) {
+        panic("sleep");
+    }
+    
+    if(lk == 0) {
+        panic("sleep without lk");
+    }
+    
+    if(lk != &amp;ptable.lock){  //DOC: sleeplock0
+        acquire(&amp;ptable.lock);  //DOC: sleeplock1
+        release(lk);
+    }
+    proc-&gt;chan = chan;
+    proc-&gt;state = SLEEPING;
+    proc-&gt;lk = lk; 
+    proc-&gt;cbc_next = next1;
+    
+    goto cbc_sched(cbc_sleep1);
+}
+</code></pre>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 id="sched">sched</h2>
+<ul lang="c">
+  <li>レジスタの値を切り替えて、スケジューラーへと戻る</li>
+  <li>再開時は swtch の下から再開する。</li>
+</ul>
+<pre><code>void sched(void)
+{   
+    int intena;
+    
+    if(!holding(&amp;ptable.lock)) {
+        panic("sched ptable.lock");
+    }
+    
+    if(cpu-&gt;ncli != 1) {
+        panic("sched locks");
+    }
+    
+    if(proc-&gt;state == RUNNING) {
+        panic("sched running");
+    }
+    
+    if(int_enabled ()) {
+        panic("sched interruptible");
+    }
+    
+    intena = cpu-&gt;intena; 
+    swtch(&amp;proc-&gt;context, cpu-&gt;scheduler);
+    cpu-&gt;intena = intena;
+}
+</code></pre>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 lang="c" id="cbcsched">cbc_sched</h2>
+<pre><code>__code cbc_sched(__code(*next)())
+{   
+    int intena;
+    
+    if(!holding(&amp;ptable.lock)) {
+        panic("sched ptable.lock");
+    }
+    
+    if(cpu-&gt;ncli != 1) {
+        panic("sched locks");
+    }
+    
+    if(proc-&gt;state == RUNNING) {
+        panic("sched running");
+    }
+    
+    if(int_enabled ()) {
+        panic("sched interruptible");
+    }
+    
+    intena = cpu-&gt;intena; 
+    swtch(&amp;proc-&gt;context, cpu-&gt;scheduler);
+    cpu-&gt;intena = intena;
+    
+    goto next();
+}
+</code></pre>
+<p>## 目次
+- xv6 の書き換えの方針について
+- cbc_read の実装
+- <strong>CbC 書き換えについての評価</strong></p>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 id="read-">read システムコールの遷移図</h2>
+<ul>
+  <li>CbC へ書き換えることで状態遷移ベースのプログラムに書き換えることができた。</li>
+  <li>現在はシステムコールのみだが、カーネル全体を書き換えることで、OS の状態遷移モデルができる。</li>
+</ul>
+<div style="text-align: center;">
+ <img src="./images/state.pdf" alt="state" width="600" />
+</div>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 id="cbc--2">CbC 書き換えについて</h2>
+<ul>
+  <li>xv6 のシステムコールを CbC に書き換えると、関数は分割され、継続後の元の環境がなくなるためプロセス構造体に値を保持しておかなくてはならないことがわかった。</li>
+  <li>しかしこれは、操作によってどの値が書き換えられるかということが明示的になり、
+また、このプロセス構造体が Context と同等の役割を果たすことがわかった。</li>
+  <li>プロセス構造体を Context として扱い、Interface を用いてモジュール化することで、値渡しなどは Meta Gear に押し込むことができると考察できる。</li>
+</ul>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 id="section-12">まとめ</h2>
+<ul>
+  <li>Interface の導入と、Meta Gear の自動変換・生成によって、ノーマルレベルのプログラミングの見通しが良くなった。</li>
+  <li>xv6 のシステムコールの書き換えにより、xv6 の CbC 書き換えの方針の考察ができた。</li>
+</ul>
+
+
+</div>
+<div class='slide '>
+<!-- _S9SLIDE_ -->
+<h2 id="section-13">今後の課題</h2>
+<ul>
+  <li>現在はシステムコールのみの書き換えだが、カーネル全体の書き換えを行う。</li>
+  <li>モジュール化された xv6 の機能を Gears OS のものと書き換えることで Gears OS に OS の機能を持たせる。</li>
+  <li>また、QEMU でのみの動作でしか確認できていないため、実機上での動作を可能にしたい。</li>
+</ul>
 <!-- === end markdown block === -->
 </div>
 
--- a/slide/slide.md	Wed Feb 13 09:47:53 2019 +0900
+++ b/slide/slide.md	Wed Feb 13 15:15:59 2019 +0900
@@ -1,4 +1,4 @@
-title: 継続を基本とした言語による OS のモジュール化
+title: 継続を基本とした言語による<br> OS のモジュール化
 author: 宮城 光希
 profile: 琉球大学理工学研究科 河野研
 lang: Japanese
@@ -52,11 +52,12 @@
 - 第2部では xv6 の CbC による書き換え について発表する。
 
 ## 目次
-- Code Gear と Data Gear
+- **Code Gear と Data Gear**
 - Gears OS におけるメタ計算
 - Context
 - Meta Code Gear
 - Interface
+- Interface 導入についての評価
 
 ## CbC のコード例
 - Code Gear は\_\_code Code Gear 名 (引数) の形で記述される。
@@ -103,6 +104,13 @@
 };
 ```
 
+## 目次
+- Code Gear と Data Gear
+- **Gears OS におけるメタ計算**
+- Context
+- Meta Code Gear
+- Interface
+
 ## Gears でのメタ計算
 - Gears OS ではメタ計算を Meta Code/Data Gear で表現する。
 - Meta Code Gear は通常の Code Gear の直後で遷移し、メタ計算を実行する。
@@ -126,12 +134,25 @@
  <img src="./images/meta_gear.pdf" alt="MetaGear" width="600">
 </div>
 
+## 目次
+- Code Gear と Data Gear
+- Gears OS におけるメタ計算
+- **Context**
+- Meta Code Gear
+- Interface
+- Interface 導入についての評価
+
 ## Context
 - Gears OS では Context と呼ばれる、使用されるすべての Code Gear、Data Gear を持つ Meta Data Gear を持っている。
 - Gears OS は必要な Code Gear、Data Gear を参照したい場合、この Context を通す必要がある。
 - Context は Meta Data Gear であるため、Meta Code Gear を介してアクセスする。
 
 ## Context
+- CbC はポインタを扱えるので、アセンブラ的に書けてしまう。
+- Code Gear は関数型プログラミング的に意味があるように書きたい。
+- Code Gear は入力された型の決まった Data Gear のみ扱えるように Context を利用する。
+
+## Context
 - Context は全ての Code Gear のリストを持っており、enum で番号とアドレスを対応付けている。
 ```c
 enum Code {
@@ -164,6 +185,14 @@
     };
 ```
 
+## 目次
+- Code Gear と Data Gear
+- Gears OS におけるメタ計算
+- Context
+- **Meta Code Gear**
+- Interface
+- Interface 導入についての評価
+
 ## stub Code Gear
 - ノーマルレベルの Gears OS では継続先に渡す Data Gear は引数の集合に見える。
 - しかし、メタレベルで見ると、Data Gear は Context が管理しており、
@@ -229,6 +258,14 @@
 }
 ```
 
+## 目次
+- Code Gear と Data Gear
+- Gears OS におけるメタ計算
+- Context
+- Meta Code Gear
+- **Interface**
+- Interface 導入についての評価
+
 ## Interface
 - Interface は Gears OS のモジュール化の仕組みである。
 - Interface はある Data Gear と、それに対する操作(API)を行う
@@ -353,9 +390,61 @@
 ```
 
 ## 目次
-- xv6 の書き換えの方針について
-- システムコールの書き換えについての考察
-- 書き換えたシステムコールを追う
+- Code Gear と Data Gear
+- Gears OS におけるメタ計算
+- Context
+- Meta Code Gear
+- Interface
+- **Interface 導入についての評価**
+
+## Interface を用いない pushStack の記述
+- Interface を用いない場合の Code Gear では、完全にメタレベルとノーマルレベルが分離されておらず、
+Code Gear の引数の Data Gear に対応する番号を示さなくてはならなかった。 
+- また、継続先も直接指定しなければならなかった。
+
+```c
+__code cg1 (struct Context* context, struct Element* element) {
+    allocate->size = sizeof(struct Node);
+    allocator(context);
+    goto meta(context, putSingleLinkedStack)
+}
+
+__code pushSingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, struct Node* node) {
+    ...
+}
+
+__code pushSingleLinkedStack_stub(struct Context* context){
+    SingleLinkedStack* stack = &context->data[SingleLinkedStack]->SingleLinkedStack;
+    Node *node = &context->data[context->dataNum]->node;
+    goto pushSingleLinkedStack(context, stack, data);
+}
+```
+
+## Interface を用いた pushStack の記述
+- Interface を用いることでノーマルレベルとメタレベルが分離され、stub も自動生成されるようになった。
+- 継続先も stack->push となることで、抽象化され、異なる実装にも対応できるようになった。
+```c
+__code cg1 (struct Stack* stack) {
+    struct Node* node1 = new Node();
+    goto stack->push((union Data*)node1,cg2);
+}
+
+__code pushSingleLinkedStack(struct SingleLinkedStack* stack, union Data* data, __code next(...)) {
+    ...
+}
+
+__code pushSingleLinkedStack_stub(struct Context* context){
+    SingleLinkedStack* stack = (SingleLinkedStack*)context->data[D_Stack]->Stack.stack->Stack.stack;
+    Data* data = &context->data[D_Stack]->Stack->data;
+    enum Code next = &context->data[D_Stack]->Stack->next;
+    goto pushSingleLinkedStack(context, stack, data, next);
+}
+```
+
+## 目次
+- **xv6 の書き換えの方針について**
+- cbc\_read の実装
+- CbC 書き換えについての評価
 
 ## xv6 の CbC 書き換え
 - xv6 は UNIX V6 を x86 向けに再実装した OS である。
@@ -373,6 +462,11 @@
 - ここでは実際にシステムコールを CbC で書き換えることによって、状態遷移ベースで書き換えるには何が必要か示すことにした。
 - 今回は read システムコールの CbC 書き換えを行なった。
 
+## 目次
+- xv6 の書き換えの方針について
+- **cbc\_read の実装**
+- CbC 書き換えについての評価
+
 ## syscall関数
 - syscall 関数 はシステムコールを呼び出す関数である。
 ```c
@@ -773,6 +867,10 @@
     goto next();
 }
 ```
+## 目次
+- xv6 の書き換えの方針について
+- cbc\_read の実装
+- **CbC 書き換えについての評価**
 
 ## read システムコールの遷移図
 - CbC へ書き換えることで状態遷移ベースのプログラムに書き換えることができた。
@@ -780,3 +878,18 @@
 <div style="text-align: center;">
  <img src="./images/state.pdf" alt="state" width="600">
 </div>
+
+## CbC 書き換えについて
+- xv6 のシステムコールを CbC に書き換えると、関数は分割され、継続後の元の環境がなくなるためプロセス構造体に値を保持しておかなくてはならないことがわかった。
+- しかしこれは、操作によってどの値が書き換えられるかということが明示的になり、
+また、このプロセス構造体が Context と同等の役割を果たすことがわかった。
+- プロセス構造体を Context として扱い、Interface を用いてモジュール化することで、値渡しなどは Meta Gear に押し込むことができると考察できる。
+
+## まとめ
+- Interface の導入と、Meta Gear の自動変換・生成によって、ノーマルレベルのプログラミングの見通しが良くなった。
+- xv6 のシステムコールの書き換えにより、xv6 の CbC 書き換えの方針の考察ができた。
+
+## 今後の課題
+- 現在はシステムコールのみの書き換えだが、カーネル全体の書き換えを行う。
+- モジュール化された xv6 の機能を Gears OS のものと書き換えることで Gears OS に OS の機能を持たせる。
+- また、QEMU でのみの動作でしか確認できていないため、実機上での動作を可能にしたい。