changeset 28:ec182063c27f

add slide
author menikon
date Sun, 16 Feb 2020 18:04:47 +0900
parents 5317715ca32d
children ae7aa3408ba5
files final_main/165723C_本稿.pdf final_main/fig/iallocloop.png final_main/fig/seni.png final_main/main.pdf final_sub/165723C_最終予稿.pdf final_sub/utf8.pdf final_sub/utf8.tex slide/CbC による xv6 の FileSystem の書き換え.html
diffstat 8 files changed, 587 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
Binary file final_main/165723C_本稿.pdf has changed
Binary file final_main/fig/iallocloop.png has changed
Binary file final_main/fig/seni.png has changed
Binary file final_main/main.pdf has changed
Binary file final_sub/165723C_最終予稿.pdf has changed
Binary file final_sub/utf8.pdf has changed
--- a/final_sub/utf8.tex	Sun Feb 16 12:32:55 2020 +0900
+++ b/final_sub/utf8.tex	Sun Feb 16 18:04:47 2020 +0900
@@ -53,7 +53,8 @@
 
 \renewcommand{\abstractname}{Abstract}
 \begin{document}
-\title{CbC による xv6 の FileSystem の書き換え}
+\title{CbC による xv6 の FileSystem の書き換え \\ Rewriting xv6 FileSystem by CbC}
+
 \author{学籍番号 : 165723C 氏名 : 坂本昂弘 {}{} 指導教員 : 河野真治}
 \date{2020年2月17日}
 \twocolumn[
@@ -61,7 +62,7 @@
 \thispagestyle{fancy}
 \centering
 \begin{onecolabstract}
-The OS is required to guarantee reliability and expandability. The Gears OS is being developed using Continuation based C (CbC) with the goal of guaranteeing reliability for normal-level computation and achieving scalability by meta-level computation. CbC uses a basic unit of processing called Code Gear and a unit of data called Data Gear. For Code Gear, there is an input Data Gear and an output Data Gear, and reliability is assured by checking whether the expected output is obtained for the input. CbC Interface is a mechanism for modularizing Gears OS. The use of Interface makes it possible to expand by verification and replacement of functions. As a pre-stage, it rewrites xv6, which is a simple operating system that has the basic structure of Unix such as processes, virtual memory, separation of kernel and user, interrupts, and file systems, with CbC. In this paper, the goal is to clarify the complex FileSystem by rewriting the xv6 FileSystem with CbC, to guarantee the reliability, and to realize the extensibility by enabling the Interface.
+The OS is required to guarantee reliability and expandability. Gears OS is being developed using Continuation based C (CbC) with the goal of guaranteeing reliability for normal-level computation and achieving scalability by meta-level computation. Although it is simple as a previous step, it rewrites xv6, which is an OS that has the basic structure of Unix such as process, virtual memory, separation of kernel and user, interrupt, file system, etc., with CbC. In this paper, we focused on the xv6 FileSystem and rewrote it with CbC.
 \end{onecolabstract}]
 
 
@@ -108,7 +109,8 @@
 
 
 \section{まとめと今後の課題}
- 本研究では xv6 の FileSystem 部分について CbC を用いて書き換えを行った。実際に FileSystem を CbC で書き換えることによって、if 文と for 文を切り出してやるができた。 さらに、FileSystem を Interface とその実装に書き換えることによって仕様と実装に分け、拡張性を高めることができた。xv6 の FileSystem 部分書き換え後 、デバックをまだ行っていないため正常に動くかどうか確認することが求められる。 また、正常に動作しなかった場合は修正を行い、OS として機能しているか再確認する必要がある。\thispagestyle{fancy}
+ 本研究では xv6 の FileSystem 部分について CbC を用いて書き換えを行った。実際に FileSystem を CbC で書き換えることによって、if 文と for 文を切り出してやるができた。 さらに、FileSystem を Interface とその実装に書き換えることによって仕様と実装に分け、拡張性を高めることができた。xv6 の FileSystem 部分書き換え後 、デバックをまだ行っていないため正常に動くかどうか確認することが求められる。 また、正常に動作しなかった場合は修正を行い、OS として機能しているか再確認する必要がある。
+ ]%\thispagestyle{fancy}
 %\begin{thebibliography}{9}
 
 \nocite{*}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/slide/CbC による xv6 の FileSystem の書き換え.html	Sun Feb 16 18:04:47 2020 +0900
@@ -0,0 +1,582 @@
+<!DOCTYPE html>
+
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black">
+    <meta name="mobile-web-app-capable" content="yes">
+    <title>
+        CbC による xv6 の FileSystem の書き換え - CodiMD
+    </title>
+    <link rel="icon" type="image/png" href="http://hackmd.cr.ie.u-ryukyu.ac.jp/favicon.png">
+    <link rel="apple-touch-icon" href="http://hackmd.cr.ie.u-ryukyu.ac.jp/apple-touch-icon.png">
+
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.0/css/bootstrap.min.css" integrity="sha256-H0KfTigpUV+0/5tn2HXC0CPwhhDhWgSawJdnFd0CGCo=" crossorigin="anonymous" />
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fork-awesome/1.1.3/css/fork-awesome.min.css" integrity="sha256-ZhApazu+kejqTYhMF+1DzNKjIzP7KXu6AzyXcC1gMus=" crossorigin="anonymous" />
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/themes/prism.min.css" integrity="sha256-vtR0hSWRc3Tb26iuN2oZHt3KRUomwTufNIf5/4oeCyg=" crossorigin="anonymous" />
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github-gist.min.css" integrity="sha256-tAflq+ymku3Khs+I/WcAneIlafYgDiOQ9stIHH985Wo=" crossorigin="anonymous" />
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
+    <style>
+        @import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600,600italic,300italic,300|Source+Serif+Pro|Source+Code+Pro:400,300,500&subset=latin,latin-ext);.markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body:after,.markdown-body:before{display:table;content:""}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#c00}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:#e7e7e7;border:0}.markdown-body blockquote{padding:0 1em;color:#777;border-left:.25em solid #ddd}.night .markdown-body blockquote{color:#bcbcbc}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body .loweralpha{list-style-type:lower-alpha}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.night .markdown-body h1,.night .markdown-body h2,.night .markdown-body h3,.night .markdown-body h4,.night .markdown-body h5,.night .markdown-body h6{color:#ddd}.markdown-body h1 .fa-link,.markdown-body h2 .fa-link,.markdown-body h3 .fa-link,.markdown-body h4 .fa-link,.markdown-body h5 .fa-link,.markdown-body h6 .fa-link{color:#000;vertical-align:middle;visibility:hidden;font-size:16px}.night .markdown-body h1 .fa-link,.night .markdown-body h2 .fa-link,.night .markdown-body h3 .fa-link,.night .markdown-body h4 .fa-link,.night .markdown-body h5 .fa-link,.night .markdown-body h6 .fa-link{color:#fff}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .fa-link,.markdown-body h2:hover .anchor .fa-link,.markdown-body h3:hover .anchor .fa-link,.markdown-body h4:hover .anchor .fa-link,.markdown-body h5:hover .anchor .fa-link,.markdown-body h6:hover .anchor .fa-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit}.markdown-body h1{font-size:2em}.markdown-body h1,.markdown-body h2{padding-bottom:.3em;border-bottom:1px solid #eee}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{font-size:.85em;color:#777}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol.no-list,.markdown-body ul.no-list{padding:0;list-style-type:none}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}.markdown-body table th{font-weight:700}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #ddd}.markdown-body table tr{background-color:#fff;border-top:1px solid #ccc}.night .markdown-body table tr{background-color:#5f5f5f}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8}.night .markdown-body table tr:nth-child(2n){background-color:#4f4f4f}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:.2em 0;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.night .markdown-body code,.night .markdown-body tt{color:#eee;background-color:hsla(0,0%,90.2%,.36)}.markdown-body code:after,.markdown-body code:before,.markdown-body tt:after,.markdown-body tt:before{letter-spacing:-.2em;content:"\A0"}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body pre code:after,.markdown-body pre code:before,.markdown-body pre tt:after,.markdown-body pre tt:before{content:normal}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-line-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown-body kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.news .alert .markdown-body blockquote{padding:0 0 0 40px;border:0}.activity-tab .news .alert .commits,.activity-tab .news .markdown-body blockquote{padding-left:0}.task-list-item{list-style-type:none}.task-list-item label{font-weight:400}.task-list-item.enabled label{cursor:pointer}.task-list-item+.task-list-item{margin-top:3px}.task-list-item-checkbox{float:left;margin:.31em 0 .2em -1.3em!important;vertical-align:middle;cursor:default!important}.markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;padding-top:40px;padding-bottom:40px;max-width:758px;overflow:visible!important}.markdown-body pre{border:inherit!important}.night .markdown-body pre{filter:invert(100%)}.markdown-body code{color:inherit!important}.markdown-body pre code .wrapper{display:-webkit-inline-flex;display:-moz-inline-flex;display:-ms-inline-flex;display:-o-inline-flex;display:inline-flex}.markdown-body pre code .gutter{float:left;overflow:hidden;-webkit-user-select:none;user-select:none}.markdown-body pre code .gutter.linenumber{text-align:right;position:relative;display:inline-block;cursor:default;z-index:4;padding:0 8px 0 0;min-width:20px;box-sizing:content-box;color:#afafaf!important;border-right:3px solid #6ce26c!important}.markdown-body pre code .gutter.linenumber>span:before{content:attr(data-linenumber)}.markdown-body pre code .code{float:left;margin:0 0 0 16px}.markdown-body .gist .line-numbers{border-left:none;border-top:none;border-bottom:none}.markdown-body .gist .line-data{border:none}.markdown-body .gist table{border-spacing:0;border-collapse:inherit!important}.night .markdown-body .gist table tr:nth-child(2n){background-color:#ddd}.markdown-body code[data-gist-id]{background:none;padding:0;filter:invert(100%)}.markdown-body code[data-gist-id]:after,.markdown-body code[data-gist-id]:before{content:""}.markdown-body code[data-gist-id] .blob-num{border:unset}.markdown-body code[data-gist-id] table{overflow:unset;margin-bottom:unset}.markdown-body code[data-gist-id] table tr{background:unset}.markdown-body[dir=rtl] pre{direction:ltr}.markdown-body[dir=rtl] code{direction:ltr;unicode-bidi:embed}.markdown-body .alert>p{margin-bottom:0}.markdown-body pre.abc,.markdown-body pre.flow-chart,.markdown-body pre.graphviz,.markdown-body pre.mermaid,.markdown-body pre.sequence-diagram{text-align:center;background-color:inherit;border-radius:0;white-space:inherit}.night .markdown-body pre.graphviz .graph>polygon{fill:#333}.night .markdown-body pre.mermaid .sectionTitle,.night .markdown-body pre.mermaid .titleText,.night .markdown-body pre.mermaid text{fill:#fff}.markdown-body pre.abc>code,.markdown-body pre.flow-chart>code,.markdown-body pre.graphviz>code,.markdown-body pre.mermaid>code,.markdown-body pre.sequence-diagram>code{text-align:left}.markdown-body pre.abc>svg,.markdown-body pre.flow-chart>svg,.markdown-body pre.graphviz>svg,.markdown-body pre.mermaid>svg,.markdown-body pre.sequence-diagram>svg{max-width:100%;height:100%}.night .markdown-body .abc path{fill:#eee}.night .markdown-body .abc path.note_selected{fill:##4DD0E1}.night tspan{fill:#fefefe}.night pre rect{fill:transparent}.night pre.flow-chart path,.night pre.flow-chart rect{stroke:#fff}.markdown-body pre>code.wrap{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}.markdown-body .alert>p,.markdown-body .alert>ul{margin-bottom:0}.markdown-body summary{display:list-item}.markdown-body summary:focus{outline:none}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>:not(summary){display:none}.markdown-body figure{margin:1em 40px}.markdown-body img{background-color:transparent}.vimeo,.youtube{cursor:pointer;display:table;text-align:center;background-position:50%;background-repeat:no-repeat;background-size:contain;background-color:#000;overflow:hidden}.vimeo,.youtube{position:relative;width:100%}.youtube{padding-bottom:56.25%}.vimeo img{width:100%;object-fit:contain;z-index:0}.youtube img{object-fit:cover;z-index:0}.vimeo iframe,.youtube iframe,.youtube img{width:100%;height:100%;position:absolute;top:0;left:0}.vimeo iframe,.youtube iframe{vertical-align:middle;z-index:1}.vimeo .icon,.youtube .icon{position:absolute;height:auto;width:auto;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;opacity:.3;-webkit-transition:opacity .2s;transition:opacity .2s;z-index:0}.vimeo:hover .icon,.youtube:hover .icon{opacity:.6;-webkit-transition:opacity .2s;transition:opacity .2s}.slideshare .inner,.speakerdeck .inner{position:relative;width:100%}.slideshare .inner iframe,.speakerdeck .inner iframe{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%}.MJX_Assistive_MathML{display:none}.ui-infobar{position:relative;z-index:2;max-width:758px;margin-top:25px;margin-bottom:-25px;color:#777}.toc .invisable-node{list-style-type:none}.ui-toc{position:fixed;bottom:20px;z-index:10000}.ui-toc-label{opacity:.3;background-color:#ccc;border:none}.ui-toc-label,.ui-toc .open .ui-toc-label{-webkit-transition:opacity .2s;transition:opacity .2s}.ui-toc .open .ui-toc-label{opacity:1;color:#fff}.ui-toc-label:focus{opacity:.3;background-color:#ccc;color:#000}.ui-toc-label:hover{opacity:1;background-color:#ccc;-webkit-transition:opacity .2s;transition:opacity .2s}.ui-toc-dropdown{margin-top:23px;margin-bottom:20px;padding-left:10px;padding-right:10px;max-width:45vw;width:25vw;max-height:70vh;overflow:auto;text-align:inherit}.ui-toc-dropdown>.toc{max-height:calc(70vh - 100px);overflow:auto}.ui-toc-dropdown[dir=rtl] .nav{padding-right:0;letter-spacing:.0029em}.ui-toc-dropdown a{overflow:hidden;text-overflow:ellipsis;white-space:pre}.ui-toc-dropdown .nav>li>a{display:block;padding:4px 20px;font-size:13px;font-weight:500;color:#767676}.ui-toc-dropdown .nav>li:first-child:last-child>ul,.ui-toc-dropdown .toc.expand ul{display:block}.ui-toc-dropdown .nav>li>a:focus,.ui-toc-dropdown .nav>li>a:hover{padding-left:19px;color:#000;text-decoration:none;background-color:transparent;border-left:1px solid #000}.night .ui-toc-dropdown .nav>li>a:focus,.night .ui-toc-dropdown .nav>li>a:hover{color:#fff;border-left-color:#fff}.ui-toc-dropdown[dir=rtl] .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav>li>a:hover{padding-right:19px;border-left:none;border-right:1px solid #000}.ui-toc-dropdown .nav>.active:focus>a,.ui-toc-dropdown .nav>.active:hover>a,.ui-toc-dropdown .nav>.active>a{padding-left:18px;font-weight:700;color:#000;background-color:transparent;border-left:2px solid #000}.night .ui-toc-dropdown .nav>.active:focus>a,.night .ui-toc-dropdown .nav>.active:hover>a,.night .ui-toc-dropdown .nav>.active>a{color:#fff;border-left:2px solid #fff}.ui-toc-dropdown[dir=rtl] .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav>.active>a{padding-right:18px;border-left:none;border-right:2px solid #000}.ui-toc-dropdown .nav .nav{display:none;padding-bottom:10px}.ui-toc-dropdown .nav>.active>ul{display:block}.ui-toc-dropdown .nav .nav>li>a{padding-top:1px;padding-bottom:1px;padding-left:30px;font-size:12px;font-weight:400}.night .ui-toc-dropdown .nav>li>a{color:#aaa}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a{padding-right:30px}.ui-toc-dropdown .nav .nav>li>ul>li>a{padding-top:1px;padding-bottom:1px;padding-left:40px;font-size:12px;font-weight:400}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a{padding-right:40px}.ui-toc-dropdown .nav .nav>li>a:focus,.ui-toc-dropdown .nav .nav>li>a:hover{padding-left:29px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:hover{padding-right:29px}.ui-toc-dropdown .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown .nav .nav>li>ul>li>a:hover{padding-left:39px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:hover{padding-right:39px}.ui-toc-dropdown .nav .nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>a{padding-left:28px;font-weight:500}.ui-toc-dropdown[dir=rtl] .nav .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>a{padding-right:28px}.ui-toc-dropdown .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active>a{padding-left:38px;font-weight:500}.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active>a{padding-right:38px}.markdown-body[lang^=ja]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,Hiragino Kaku Gothic Pro,"\30D2\30E9\30AE\30CE\89D2\30B4   Pro W3",Osaka,Meiryo,"\30E1\30A4\30EA\30AA",MS Gothic,"\FF2D\FF33   \30B4\30B7\30C3\30AF",sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.ui-toc-dropdown[lang^=ja]{font-family:Source Sans Pro,Helvetica,Arial,Meiryo UI,MS PGothic,"\FF2D\FF33   \FF30\30B4\30B7\30C3\30AF",sans-serif}.markdown-body[lang=zh-tw]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,PingFang TC,Microsoft JhengHei,"\5FAE\8EDF\6B63\9ED1",sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.ui-toc-dropdown[lang=zh-tw]{font-family:Source Sans Pro,Helvetica,Arial,Microsoft JhengHei UI,"\5FAE\8EDF\6B63\9ED1UI",sans-serif}.markdown-body[lang=zh-cn]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,PingFang SC,Microsoft YaHei,"\5FAE\8F6F\96C5\9ED1",sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.ui-toc-dropdown[lang=zh-cn]{font-family:Source Sans Pro,Helvetica,Arial,Microsoft YaHei UI,"\5FAE\8F6F\96C5\9ED1UI",sans-serif}.ui-affix-toc{position:fixed;top:0;max-width:15vw;max-height:70vh;overflow:auto}.back-to-top,.expand-toggle,.go-to-bottom{display:block;padding:4px 10px;margin-top:10px;margin-left:10px;font-size:12px;font-weight:500;color:#999}.back-to-top:focus,.back-to-top:hover,.expand-toggle:focus,.expand-toggle:hover,.go-to-bottom:focus,.go-to-bottom:hover{color:#563d7c;text-decoration:none}.back-to-top,.go-to-bottom{margin-top:0}.ui-user-icon{width:20px;height:20px;display:block;border-radius:3px;margin-top:2px;margin-bottom:2px;margin-right:5px;background-position:50%;background-repeat:no-repeat;background-size:contain}.ui-user-icon.small{width:18px;height:18px;display:inline-block;vertical-align:middle;margin:0 0 .2em}small span{line-height:22px}small .dropdown{display:inline-block}small .dropdown a:focus,small .dropdown a:hover{text-decoration:none}.unselectable{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;user-select:none}.night .navbar{background:#333;border-bottom-color:#333;color:#eee}.night .navbar a{color:#eee}@media print{blockquote,div,img,pre,table{page-break-inside:avoid!important}a[href]:after{font-size:12px!important}}.markdown-body.slides{position:relative;z-index:1;color:#222}.markdown-body.slides:before{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1;background-color:currentColor;box-shadow:0 0 0 50vw}.markdown-body.slides section[data-markdown]{position:relative;margin-bottom:1.5em;background-color:#fff;text-align:center}.markdown-body.slides section[data-markdown] code{text-align:left}.markdown-body.slides section[data-markdown]:before{content:"";display:block;padding-bottom:56.23%}.markdown-body.slides section[data-markdown]>div:first-child{position:absolute;top:50%;left:1em;right:1em;transform:translateY(-50%);max-height:100%;overflow:hidden}.markdown-body.slides section[data-markdown]>ul{display:inline-block}.markdown-body.slides>section>section+section:after{content:"";position:absolute;top:-1.5em;right:1em;height:1.5em;border:3px solid #777}body{font-smoothing:subpixel-antialiased!important;-webkit-font-smoothing:subpixel-antialiased!important;-moz-osx-font-smoothing:auto!important;text-shadow:0 0 1em transparent,1px 1px 1.2px rgba(0,0,0,.004);-webkit-overflow-scrolling:touch;font-family:Source Sans Pro,Helvetica,Arial,sans-serif;letter-spacing:.025em}.focus,:focus{outline:none!important}::-moz-focus-inner{border:0!important}body.modal-open{overflow-y:auto;padding-right:0!important}
+    </style>
+    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
+    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
+    <!--[if lt IE 9]>
+    	<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js" integrity="sha256-3Jy/GbSLrg0o9y5Z5n1uw0qxZECH7C6OQpVBgNFYa0g=" crossorigin="anonymous"></script>
+    	<script src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js" integrity="sha256-g6iAfvZp+nDQ2TdTR/VVKJf3bGro4ub5fvWSWVRi2NE=" crossorigin="anonymous"></script>
+		<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.9/es5-shim.min.js" integrity="sha256-8E4Is26QH0bD52WoQpcB+R/tcWQtpzlCojrybUd7Mxo=" crossorigin="anonymous"></script>
+    <![endif]-->
+</head>
+
+<body>
+    <div id="doc" class="markdown-body container-fluid"><h1 id="CbC-による-xv6-の-FileSystem-の書き換え"><a class="anchor hidden-xs" href="#CbC-による-xv6-の-FileSystem-の書き換え" title="CbC-による-xv6-の-FileSystem-の書き換え"><i class="fa fa-link"></i></a>CbC による xv6 の FileSystem の書き換え</h1><ul>
+<li>
+<p>並列信頼研</p>
+</li>
+<li>
+<p>坂本昂弘</p>
+</li>
+</ul><h2 id="研究目的"><a class="anchor hidden-xs" href="#研究目的" title="研究目的"><i class="fa fa-link"></i></a>研究目的</h2><ul>
+<li>
+<p>OSに対し高い信頼性を実現させたい</p>
+</li>
+<li>
+<p>そのために当研究室ではContinuation based C (CbC)を用いたGearsOSを設計中である</p>
+</li>
+<li>
+<p>前段階としてシンプルであるが基本的な機能を揃えたOSであるxv6をCbCで書き換える</p>
+</li>
+<li>
+<p>CbCは処理の基本単位をCodeGearとし、stackに値を積む事なくCodeGear間を遷移する</p>
+</li>
+<li>
+<p>CodeGear間は状態遷移であるためOS内部を明確化することができる</p>
+</li>
+<li>
+<p>本研究ではOS内部の明確化を実現し信頼性を向上させるためにCbCを用いFileSystemを書き換える</p>
+</li>
+</ul><hr><h1 id="ノーマルレベルとメタレベル"><a class="anchor hidden-xs" href="#ノーマルレベルとメタレベル" title="ノーマルレベルとメタレベル"><i class="fa fa-link"></i></a>ノーマルレベルとメタレベル</h1><ul>
+<li>ノーマルレベル
+<ul>
+<li>プログラマーがしたい処理部分</li>
+</ul>
+</li>
+<li>メタレベル
+<ul>
+<li>資源管理やCPU自体の操作</li>
+</ul>
+</li>
+</ul><hr><h1 id="Continuation-based-C"><a class="anchor hidden-xs" href="#Continuation-based-C" title="Continuation-based-C"><i class="fa fa-link"></i></a>Continuation based C</h1><ul>
+<li>状態遷移ベースで記述できる言語(以下CbC)</li>
+<li>C の関数呼び出しとは異なり、stack に値を積まない</li>
+<li>Code Gear
+<ul>
+<li>基本的な処理の単位</li>
+<li>goto 文で遷移する</li>
+</ul>
+</li>
+<li>Data Gear
+<ul>
+<li>Code Gear からアクセスできるデータの単位</li>
+<li>引数など</li>
+</ul>
+</li>
+<li>Meta Code Gear
+<ul>
+<li>Code Gear の間に挟まれるメタレベルの処理</li>
+</ul>
+</li>
+<li>Meta Data Gear
+<ul>
+<li>Code Gearの間の接続などの情報</li>
+<li>Context(後ほど説明)</li>
+</ul>
+</li>
+</ul><hr><h1 id="ノーマルレベル"><a class="anchor hidden-xs" href="#ノーマルレベル" title="ノーマルレベル"><i class="fa fa-link"></i></a>ノーマルレベル</h1><hr><h1 id="Code-Gear-による継続"><a class="anchor hidden-xs" href="#Code-Gear-による継続" title="Code-Gear-による継続"><i class="fa fa-link"></i></a>Code Gear による継続</h1><ul>
+<li>Code Gear の処理の間を goto によって遷移していく</li>
+<li>__code CodeGear名 で定義<br>
+<img src="https://i.imgur.com/etfQund.png" alt=""></li>
+</ul><hr><h1 id="Data-Gear-の継続"><a class="anchor hidden-xs" href="#Data-Gear-の継続" title="Data-Gear-の継続"><i class="fa fa-link"></i></a>Data Gear の継続</h1><ul>
+<li>Code Gear からアクセスできるデータ</li>
+<li>Code Gear の計算の入力と、計算の出力が存在する</li>
+</ul><p><img src="https://i.imgur.com/3E0DGWA.png" alt=""></p><hr><h1 id="メタレベル"><a class="anchor hidden-xs" href="#メタレベル" title="メタレベル"><i class="fa fa-link"></i></a>メタレベル</h1><hr><h1 id="Meta-Code-Gear"><a class="anchor hidden-xs" href="#Meta-Code-Gear" title="Meta-Code-Gear"><i class="fa fa-link"></i></a>Meta Code Gear</h1><ul>
+<li>メタレベルで見ると Code Gear の間にメタレベルの処理が挟まっている<br>
+<img src="https://i.imgur.com/vy0NxrG.png" alt=""></li>
+</ul><hr><h1 id="Meta-Data-Gear"><a class="anchor hidden-xs" href="#Meta-Data-Gear" title="Meta-Data-Gear"><i class="fa fa-link"></i></a>Meta Data Gear</h1><ul>
+<li>ノーマルレベルでの書き換えやアクセスを防ぐために存在</li>
+<li>CbC の 接続可能な Code Gear, Data Gear のリスト</li>
+<li>Data Gear を確保するメモリ空間</li>
+<li>Context</li>
+</ul><hr><h1 id="Context"><a class="anchor hidden-xs" href="#Context" title="Context"><i class="fa fa-link"></i></a>Context</h1><ul>
+<li>Meta Data Gear</li>
+<li>Contextには全てのData Gear と Code Gear が登録されている</li>
+<li>ユーザープロセスに対応して1つのcontextが存在する<br>
+<img src="https://i.imgur.com/GLIew1x.png" alt=""></li>
+<li>Context でメタレベルとノーマルレベルを中継している</li>
+</ul><hr><h1 id="Xv6"><a class="anchor hidden-xs" href="#Xv6" title="Xv6"><i class="fa fa-link"></i></a>Xv6</h1><ul>
+<li>MIT の講義用教材として作られたOS</li>
+<li>xv6 は Unix の基本的な構造を持っている。
+<ul>
+<li>プロセス</li>
+<li>仮想メモリ</li>
+<li>ファイルシステム</li>
+</ul>
+</li>
+<li>Xv6 をCbCで書き換える</li>
+</ul><hr><h1 id="Xv6のFileSystem"><a class="anchor hidden-xs" href="#Xv6のFileSystem" title="Xv6のFileSystem"><i class="fa fa-link"></i></a>Xv6のFileSystem</h1><ul>
+<li>FileSystem は コンピュータの資源を操作するための OS が持つ機能である</li>
+<li>xv6 の FileSystem は、デバイスやプロセス、カーネル内の処理をする際の情報などをファイルとして扱う</li>
+<li></li>
+</ul><hr><h1 id="Xv6の書き換え方針"><a class="anchor hidden-xs" href="#Xv6の書き換え方針" title="Xv6の書き換え方針"><i class="fa fa-link"></i></a>Xv6の書き換え方針</h1><ul>
+<li>メタレベルからノーマルレベルを保証するOSを作りたい</li>
+<li>段階的に書き換えていきたい</li>
+<li>FileSystem を書き換える理由
+<ul>
+<li>FileSystem は状態が複雑に変化するため、信頼性を保証する必要がある</li>
+</ul>
+</li>
+<li>__code で書き直していく</li>
+</ul><hr><h1 id="インターフェースの導入"><a class="anchor hidden-xs" href="#インターフェースの導入" title="インターフェースの導入"><i class="fa fa-link"></i></a>インターフェースの導入</h1><ul>
+<li>CbC のモジュール化の方法</li>
+<li>Javaのインターフェースと同様</li>
+<li>インターフェースによるメリット
+<ul>
+<li>複雑な記述の解消</li>
+<li>入力の切り替えによる実装の入れ替え</li>
+</ul>
+</li>
+<li>実装は別で定義し、呼び出す
+<ul>
+<li>後ほど説明</li>
+</ul>
+</li>
+</ul><hr><h1 id="CbCインターフェース"><a class="anchor hidden-xs" href="#CbCインターフェース" title="CbCインターフェース"><i class="fa fa-link"></i></a>CbCインターフェース</h1><ul>
+<li>Data Gear と Data Gear に対して操作を行う Code Gear の集合を表現する <strong>Meta Data Gear</strong></li>
+<li>インターフェースを定義してそこから呼び出す</li>
+</ul><hr><h1 id="インターフェースの定義"><a class="anchor hidden-xs" href="#インターフェースの定義" title="インターフェースの定義"><i class="fa fa-link"></i></a>インターフェースの定義</h1><ul>
+<li>Xv6 の FileSystem の インターフェース</li>
+<li>typedef struct の直後にインターフェース名(fs)を書く</li>
+</ul><pre><code class="c hljs">typedef <span class="hljs-keyword">struct</span> fs&lt;Type,Impl&gt; {
+    __<span class="hljs-function">code <span class="hljs-title">readsb</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, __code next(...</span>))</span>;
+    __<span class="hljs-function">code <span class="hljs-title">iinit</span>(<span class="hljs-params">Impl* fs, __code next(...</span>))</span>;
+    __<span class="hljs-function">code <span class="hljs-title">ialloc</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, __code next(...</span>))</span>;
+    __<span class="hljs-function">code <span class="hljs-title">iupdate</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">struct</span> inode* ip, __code next(...</span>))</span>;
+    __<span class="hljs-function">code <span class="hljs-title">idup</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">struct</span> inode* ip, __code next(...</span>))</span>;
+....
+} fs;
+</code></pre><hr><h1 id="インターフェースの-Code-Gear2行目"><a class="anchor hidden-xs" href="#インターフェースの-Code-Gear2行目" title="インターフェースの-Code-Gear2行目"><i class="fa fa-link"></i></a>インターフェースの Code Gear(2行目~)</h1><ul>
+<li>fs で使う Code Gear を登録する</li>
+<li>Code Gear は __code CodeGear名(引数); で記述する
+<ul>
+<li>引数が Data Gear に相当する</li>
+</ul>
+</li>
+<li>第1引数の Impl* fs がインターフェースの実装の型になる</li>
+</ul><pre><code class="c hljs">typedef <span class="hljs-keyword">struct</span> fs&lt;Type,Impl&gt; {
+    __<span class="hljs-function">code <span class="hljs-title">readsb</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, __code next(...</span>))</span>;
+    __<span class="hljs-function">code <span class="hljs-title">iinit</span>(<span class="hljs-params">Impl* fs, __code next(...</span>))</span>;
+    __<span class="hljs-function">code <span class="hljs-title">ialloc</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, __code next(...</span>))</span>;
+    __<span class="hljs-function">code <span class="hljs-title">iupdate</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">struct</span> inode* ip, __code next(...</span>))</span>;
+    __<span class="hljs-function">code <span class="hljs-title">idup</span>(<span class="hljs-params">Impl* fs, <span class="hljs-keyword">struct</span> inode* ip, __code next(...</span>))</span>;
+....
+
+</code></pre><hr><h1 id="Interface-の実装の型"><a class="anchor hidden-xs" href="#Interface-の実装の型" title="Interface-の実装の型"><i class="fa fa-link"></i></a>Interface の実装の型</h1><ul>
+<li>実装側のヘッダーファイルも fs_impl と同じように用意する</li>
+</ul><pre><code class="c hljs">typedef <span class="hljs-keyword">struct</span> fs_impl&lt;Type, Isa&gt; impl fs{
+    __<span class="hljs-function">code <span class="hljs-title">allocinode</span>(<span class="hljs-params">Type* fs_impl, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, __code next(...</span>))</span>;
+    __<span class="hljs-function">code <span class="hljs-title">allocinode_loop</span>(<span class="hljs-params">Type* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(...</span>))</span>;
+    __<span class="hljs-function">code <span class="hljs-title">allocinode_loopcheck</span>(<span class="hljs-params">Type* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(...</span>))</span>;
+    __<span class="hljs-function">code <span class="hljs-title">allocinode_noloop</span>(<span class="hljs-params">Type* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(<span class="hljs-keyword">int</span> ret, ...</span>))</span>;
+....
+} fs_impl;
+
+</code></pre><hr><h1 id="fsインターフェースの実装の初期化"><a class="anchor hidden-xs" href="#fsインターフェースの実装の初期化" title="fsインターフェースの実装の初期化"><i class="fa fa-link"></i></a>fsインターフェースの実装の初期化</h1><ul>
+<li>定義が終わったのでインターフェースを使用したい</li>
+<li>メモリ上にインターフェースの置き場所と実装を確保
+<ul>
+<li>struct fs* fs  = new fs();</li>
+</ul>
+</li>
+<li>インターフェースと実装の紐付け
+<ul>
+<li>fs-&gt;ialloc = C_iallocfs_impl;
+<ul>
+<li>Code Gear の enum の設定</li>
+<li>インターフェースのAPIと enum の番号を紐付けている</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul><pre><code class="c hljs">fs* createfs_impl(struct Context* cbc_context) {
+    struct fs* fs  = <span class="hljs-keyword">new</span> fs();
+    struct fs_impl* fs_impl = <span class="hljs-keyword">new</span> fs_impl();
+    fs-&gt;fs = (union Data*)fs_impl;
+....
+    fs-&gt;readsb = C_readsbfs_impl;
+    fs-&gt;iinit = C_iinitfs_impl;
+    fs-&gt;ialloc = C_iallocfs_impl;
+    fs-&gt;iupdate = C_iupdatefs_impl;
+....
+    <span class="hljs-keyword">return</span> fs;
+}
+</code></pre><hr><h1 id="インターフェースで定義した-CodeGear-の実装の例"><a class="anchor hidden-xs" href="#インターフェースで定義した-CodeGear-の実装の例" title="インターフェースで定義した-CodeGear-の実装の例"><i class="fa fa-link"></i></a>インターフェースで定義した CodeGear の実装の例</h1><ul>
+<li>ialloc
+<ul>
+<li>C_iallocfs_impl が 初期化時に iallocfs_impl と対応する</li>
+</ul>
+</li>
+</ul><pre><code class="c hljs">__<span class="hljs-function">code <span class="hljs-title">iallocfs_impl</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, __code next(...</span>)) </span>{
+    <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode</span>(<span class="hljs-params">fs, dev, sb, next(...</span>))</span>;
+}
+</code></pre><hr><h1 id="インターフェース実装内の-CbC"><a class="anchor hidden-xs" href="#インターフェース実装内の-CbC" title="インターフェース実装内の-CbC"><i class="fa fa-link"></i></a>インターフェース実装内の CbC</h1><ul>
+<li>for文やif文がある場合はさらに実装を分ける
+<ul>
+<li>Basic Block をもとに状態遷移ベースで記述したい</li>
+</ul>
+</li>
+<li>インターフェースは外から呼び出されるAPI</li>
+<li>それに対してインターフェースの実装の Code Gearから明示的に呼び出される Code Gearは、Java の private メソッドのように扱われる。</li>
+<li>実際に fs.c の ialloc の実装を分けた記述を説明する</li>
+</ul><p><img src="https://i.imgur.com/pkPvrSI.png" alt=""></p><hr><h1 id="ialloc-の-CbCによる書き換え"><a class="anchor hidden-xs" href="#ialloc-の-CbCによる書き換え" title="ialloc-の-CbCによる書き換え"><i class="fa fa-link"></i></a>ialloc の CbCによる書き換え</h1><ul>
+<li>FileSystemの代表的なAPIであるiallocをCbCで書き直した</li>
+<li>ialloc
+<ul>
+<li>inodeにi-numberという番号を割り当てている</li>
+</ul>
+</li>
+</ul><h3 id="元ソースコード"><a class="anchor hidden-xs" href="#元ソースコード" title="元ソースコード"><i class="fa fa-link"></i></a>元ソースコード</h3><pre><code class="clike hljs"><span class="hljs-function">struct inode* <span class="hljs-title">ialloc</span> <span class="hljs-params">(uint dev, <span class="hljs-keyword">short</span> type)</span>
+</span>{
+    <span class="hljs-keyword">int</span> inum;
+    <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">buf</span> *<span class="hljs-title">bp</span>;</span>
+    <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">dinode</span> *<span class="hljs-title">dip</span>;</span>
+    <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">superblock</span> <span class="hljs-title">sb</span>;</span>
+
+    readsb(dev, &amp;sb);
+
+    <span class="hljs-keyword">for</span> (inum = <span class="hljs-number">1</span>; inum &lt; sb.ninodes; inum++) {
+        bp = bread(dev, IBLOCK(inum));
+        dip = (struct dinode*) bp-&gt;data + inum % IPB;
+
+        <span class="hljs-keyword">if</span> (dip-&gt;type == <span class="hljs-number">0</span>) {  <span class="hljs-comment">// a free inode</span>
+            <span class="hljs-built_in">memset</span>(dip, <span class="hljs-number">0</span>, <span class="hljs-keyword">sizeof</span>(*dip));
+            dip-&gt;type = type;
+            log_write(bp);   <span class="hljs-comment">// mark it allocated on the disk</span>
+            brelse(bp);
+            <span class="hljs-keyword">return</span> iget(dev, inum);
+        }
+
+        brelse(bp);
+    }
+
+    panic(<span class="hljs-string">"ialloc: no inodes"</span>);
+}
+</code></pre><h3 id="iallocの処理の流れ"><a class="anchor hidden-xs" href="#iallocの処理の流れ" title="iallocの処理の流れ"><i class="fa fa-link"></i></a>iallocの処理の流れ</h3><p><img src="https://i.imgur.com/P4kKujB.png" alt=""></p><h3 id="元ソースコード1"><a class="anchor hidden-xs" href="#元ソースコード1" title="元ソースコード1"><i class="fa fa-link"></i></a>元ソースコード</h3><pre><code class="clike hljs"><span class="hljs-function">struct inode* <span class="hljs-title">ialloc</span> <span class="hljs-params">(uint dev, <span class="hljs-keyword">short</span> type)</span>
+</span>{
+    <span class="hljs-keyword">int</span> inum;
+    <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">buf</span> *<span class="hljs-title">bp</span>;</span>
+    <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">dinode</span> *<span class="hljs-title">dip</span>;</span>
+    <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">superblock</span> <span class="hljs-title">sb</span>;</span>
+
+    readsb(dev, &amp;sb);
+
+    <span class="hljs-keyword">for</span> (inum = <span class="hljs-number">1</span>; inum &lt; sb.ninodes; inum++) {
+        bp = bread(dev, IBLOCK(inum));
+        dip = (struct dinode*) bp-&gt;data + inum % IPB;
+
+        <span class="hljs-keyword">if</span> (dip-&gt;type == <span class="hljs-number">0</span>) { 
+            <span class="hljs-built_in">memset</span>(dip, <span class="hljs-number">0</span>, <span class="hljs-keyword">sizeof</span>(*dip));
+            dip-&gt;type = type;
+            log_write(bp);   
+            brelse(bp);
+            <span class="hljs-keyword">return</span> iget(dev, inum);
+        }
+
+        brelse(bp);
+    }
+
+    panic(<span class="hljs-string">"ialloc: no inodes"</span>);
+}
+</code></pre><h3 id="CbCで書き換えたiallc"><a class="anchor hidden-xs" href="#CbCで書き換えたiallc" title="CbCで書き換えたiallc"><i class="fa fa-link"></i></a>CbCで書き換えたiallc</h3><pre><code class="clike hljs">__<span class="hljs-function">code <span class="hljs-title">iallocfs_impl</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, __code next(...</span>)) </span>{
+    <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode</span>(<span class="hljs-params">fs, dev, sb, next(...</span>))</span>;
+}
+</code></pre><pre><code class="clike hljs">__<span class="hljs-function">code <span class="hljs-title">allocinode_loopcheck</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(...</span>))</span>{ <span class="hljs-comment">//:skip</span>
+    <span class="hljs-keyword">if</span>( inum &lt; sb-&gt;ninodes){
+        <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode_loop</span>(<span class="hljs-params">fs_impl, inum, dev, type, sb, bp, dip, next(...</span>))</span>;
+    }
+    <span class="hljs-keyword">char</span>* msg = <span class="hljs-string">"failed allocinode..."</span>;
+    <span class="hljs-keyword">struct</span> Err* err = createKernelError(&amp;proc-&gt;cbc_context);
+    Gearef(cbc_context, Err)-&gt;msg = msg;
+    <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">meta</span>(<span class="hljs-params">cbc_context, err-&gt;panic</span>)</span>;
+}
+__<span class="hljs-function">code <span class="hljs-title">allocinode_loop</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(...</span>))</span>{ <span class="hljs-comment">//:skip</span>
+    bp = bread(dev, IBLOCK(inum));
+    dip = (<span class="hljs-keyword">struct</span> dinode*) bp-&gt;data + inum % IPB;
+    <span class="hljs-keyword">if</span>(dip-&gt;type = <span class="hljs-number">0</span>){
+        <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode_noloop</span>(<span class="hljs-params">fs_impl, inum, dev, sb, bp, dip, next(...</span>))</span>;
+    }
+__<span class="hljs-function">code <span class="hljs-title">allocinode_noloop</span>(<span class="hljs-params"><span class="hljs-keyword">struct</span> fs_impl* fs_impl, <span class="hljs-keyword">uint</span> inum, <span class="hljs-keyword">uint</span> dev, <span class="hljs-keyword">short</span> type, <span class="hljs-keyword">struct</span> superblock* sb, <span class="hljs-keyword">struct</span> buf* bp, <span class="hljs-keyword">struct</span> dinode* dip, __code next(<span class="hljs-keyword">int</span> ret, ...</span>))</span>{ <span class="hljs-comment">//:skip</span>
+    memset(dip, <span class="hljs-number">0</span>, <span class="hljs-keyword">sizeof</span>(*dip));
+    dip-&gt;type = type;
+    log_write(bp);
+    brelse(bp);
+    ret = iget(dev, inum);
+    <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">next</span>(<span class="hljs-params">ret, ...</span>)</span>;
+}
+    brelse(bp);
+    inum++;
+    <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">allocinode_loopcheck</span>(<span class="hljs-params">fs_impl, inum, dev, type, sb, bp, dip, next(...</span>))</span>;
+}
+</code></pre><hr><h1 id="書き換えの評価"><a class="anchor hidden-xs" href="#書き換えの評価" title="書き換えの評価"><i class="fa fa-link"></i></a>書き換えの評価</h1><ul>
+<li>今回はfor文やif文がある場合切り出してやり、Basic Block 単位に書き換えることができた</li>
+<li>Basic Block 単位に書き換えたことによって、組み合わせを変え処理の改善などに利用可能</li>
+</ul><h2 id="まとめと今後の方針"><a class="anchor hidden-xs" href="#まとめと今後の方針" title="まとめと今後の方針"><i class="fa fa-link"></i></a>まとめと今後の方針</h2><ul>
+<li>OS 内部で CbC インターフェースを扱えるようになった</li>
+<li>CbC の書 き換えが完了すれば、継続の入力と出力を検査することで OS の信頼性を保証したり、インターフェースの実装の入れ替えが可能になる</li>
+</ul></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">
+                <i class="fa fa-bars"></i>
+            </a>
+            <ul id="ui-toc" class="ui-toc-dropdown dropdown-menu" aria-labelledby="tocLabel">
+                <div class="toc"><ul class="nav">
+<li><a href="#CbC-による-xv6-の-FileSystem-の書き換え" title="CbC による xv6 の FileSystem の書き換え">CbC による xv6 の FileSystem の書き換え</a><ul class="nav">
+<li><a href="#研究目的" title="研究目的">研究目的</a></li>
+</ul>
+</li>
+<li><a href="#ノーマルレベルとメタレベル" title="ノーマルレベルとメタレベル">ノーマルレベルとメタレベル</a></li>
+<li><a href="#Continuation-based-C" title="Continuation based C">Continuation based C</a></li>
+<li><a href="#ノーマルレベル" title="ノーマルレベル">ノーマルレベル</a></li>
+<li><a href="#Code-Gear-による継続" title="Code Gear による継続">Code Gear による継続</a></li>
+<li><a href="#Data-Gear-の継続" title="Data Gear の継続">Data Gear の継続</a></li>
+<li><a href="#メタレベル" title="メタレベル">メタレベル</a></li>
+<li><a href="#Meta-Code-Gear" title="Meta Code Gear">Meta Code Gear</a></li>
+<li><a href="#Meta-Data-Gear" title="Meta Data Gear">Meta Data Gear</a></li>
+<li><a href="#Context" title="Context">Context</a></li>
+<li><a href="#Xv6" title="Xv6">Xv6</a></li>
+<li><a href="#Xv6のFileSystem" title="Xv6のFileSystem">Xv6のFileSystem</a></li>
+<li><a href="#Xv6の書き換え方針" title="Xv6の書き換え方針">Xv6の書き換え方針</a></li>
+<li><a href="#インターフェースの導入" title="インターフェースの導入">インターフェースの導入</a></li>
+<li><a href="#CbCインターフェース" title="CbCインターフェース">CbCインターフェース</a></li>
+<li><a href="#インターフェースの定義" title="インターフェースの定義">インターフェースの定義</a></li>
+<li><a href="#インターフェースの-Code-Gear2行目" title="インターフェースの Code Gear(2行目~)">インターフェースの Code Gear(2行目~)</a></li>
+<li class=""><a href="#Interface-の実装の型" title="Interface の実装の型">Interface の実装の型</a></li>
+<li class=""><a href="#fsインターフェースの実装の初期化" title="fsインターフェースの実装の初期化">fsインターフェースの実装の初期化</a></li>
+<li class=""><a href="#インターフェースで定義した-CodeGear-の実装の例" title="インターフェースで定義した CodeGear の実装の例">インターフェースで定義した CodeGear の実装の例</a></li>
+<li class=""><a href="#インターフェース実装内の-CbC" title="インターフェース実装内の CbC">インターフェース実装内の CbC</a></li>
+<li class=""><a href="#ialloc-の-CbCによる書き換え" title="ialloc の CbCによる書き換え">ialloc の CbCによる書き換え</a><ul class="nav">
+<li class="invisable-node"><ul class="nav">
+<li class=""><a href="#元ソースコード" title="元ソースコード">元ソースコード</a></li>
+<li class=""><a href="#iallocの処理の流れ" title="iallocの処理の流れ">iallocの処理の流れ</a></li>
+<li class=""><a href="#元ソースコード1" title="元ソースコード">元ソースコード</a></li>
+<li class=""><a href="#CbCで書き換えたiallc" title="CbCで書き換えたiallc">CbCで書き換えたiallc</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class=""><a href="#書き換えの評価" title="書き換えの評価">書き換えの評価</a><ul class="nav">
+<li class=""><a href="#まとめと今後の方針" title="まとめと今後の方針">まとめと今後の方針</a></li>
+</ul>
+</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>
+        </div>
+    </div>
+    <div id="ui-toc-affix" class="ui-affix-toc ui-toc-dropdown unselectable hidden-print" data-spy="affix" style="top:17px;display:none;"  >
+        <div class="toc"><ul class="nav">
+<li><a href="#CbC-による-xv6-の-FileSystem-の書き換え" title="CbC による xv6 の FileSystem の書き換え">CbC による xv6 の FileSystem の書き換え</a><ul class="nav">
+<li><a href="#研究目的" title="研究目的">研究目的</a></li>
+</ul>
+</li>
+<li><a href="#ノーマルレベルとメタレベル" title="ノーマルレベルとメタレベル">ノーマルレベルとメタレベル</a></li>
+<li><a href="#Continuation-based-C" title="Continuation based C">Continuation based C</a></li>
+<li><a href="#ノーマルレベル" title="ノーマルレベル">ノーマルレベル</a></li>
+<li><a href="#Code-Gear-による継続" title="Code Gear による継続">Code Gear による継続</a></li>
+<li><a href="#Data-Gear-の継続" title="Data Gear の継続">Data Gear の継続</a></li>
+<li><a href="#メタレベル" title="メタレベル">メタレベル</a></li>
+<li><a href="#Meta-Code-Gear" title="Meta Code Gear">Meta Code Gear</a></li>
+<li><a href="#Meta-Data-Gear" title="Meta Data Gear">Meta Data Gear</a></li>
+<li><a href="#Context" title="Context">Context</a></li>
+<li><a href="#Xv6" title="Xv6">Xv6</a></li>
+<li><a href="#Xv6のFileSystem" title="Xv6のFileSystem">Xv6のFileSystem</a></li>
+<li><a href="#Xv6の書き換え方針" title="Xv6の書き換え方針">Xv6の書き換え方針</a></li>
+<li><a href="#インターフェースの導入" title="インターフェースの導入">インターフェースの導入</a></li>
+<li><a href="#CbCインターフェース" title="CbCインターフェース">CbCインターフェース</a></li>
+<li><a href="#インターフェースの定義" title="インターフェースの定義">インターフェースの定義</a></li>
+<li><a href="#インターフェースの-Code-Gear2行目" title="インターフェースの Code Gear(2行目~)">インターフェースの Code Gear(2行目~)</a></li>
+<li class=""><a href="#Interface-の実装の型" title="Interface の実装の型">Interface の実装の型</a></li>
+<li class=""><a href="#fsインターフェースの実装の初期化" title="fsインターフェースの実装の初期化">fsインターフェースの実装の初期化</a></li>
+<li class=""><a href="#インターフェースで定義した-CodeGear-の実装の例" title="インターフェースで定義した CodeGear の実装の例">インターフェースで定義した CodeGear の実装の例</a></li>
+<li class=""><a href="#インターフェース実装内の-CbC" title="インターフェース実装内の CbC">インターフェース実装内の CbC</a></li>
+<li class=""><a href="#ialloc-の-CbCによる書き換え" title="ialloc の CbCによる書き換え">ialloc の CbCによる書き換え</a><ul class="nav">
+<li class="invisable-node"><ul class="nav">
+<li class=""><a href="#元ソースコード" title="元ソースコード">元ソースコード</a></li>
+<li class=""><a href="#iallocの処理の流れ" title="iallocの処理の流れ">iallocの処理の流れ</a></li>
+<li class=""><a href="#元ソースコード1" title="元ソースコード">元ソースコード</a></li>
+<li class=""><a href="#CbCで書き換えたiallc" title="CbCで書き換えたiallc">CbCで書き換えたiallc</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class=""><a href="#書き換えの評価" title="書き換えの評価">書き換えの評価</a><ul class="nav">
+<li class=""><a href="#まとめと今後の方針" title="まとめと今後の方針">まとめと今後の方針</a></li>
+</ul>
+</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>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.0/js/bootstrap.min.js" integrity="sha256-kJrlY+s09+QoWjpkOrXXwhxeaoDz9FW5SaxF8I0DibQ=" crossorigin="anonymous" defer></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
+    <script>
+        var markdown = $(".markdown-body");
+        //smooth all hash trigger scrolling
+        function smoothHashScroll() {
+            var hashElements = $("a[href^='#']").toArray();
+            for (var i = 0; i < hashElements.length; i++) {
+                var element = hashElements[i];
+                var $element = $(element);
+                var hash = element.hash;
+                if (hash) {
+                    $element.on('click', function (e) {
+                        // store hash
+                        var hash = this.hash;
+                        if ($(hash).length <= 0) return;
+                        // prevent default anchor click behavior
+                        e.preventDefault();
+                        // animate
+                        $('body, html').stop(true, true).animate({
+                            scrollTop: $(hash).offset().top
+                        }, 100, "linear", function () {
+                            // when done, add hash to url
+                            // (default click behaviour)
+                            window.location.hash = hash;
+                        });
+                    });
+                }
+            }
+        }
+
+        smoothHashScroll();
+        var toc = $('.ui-toc');
+        var tocAffix = $('.ui-affix-toc');
+        var tocDropdown = $('.ui-toc-dropdown');
+        //toc
+        tocDropdown.click(function (e) {
+            e.stopPropagation();
+        });
+
+        var enoughForAffixToc = true;
+
+        function generateScrollspy() {
+            $(document.body).scrollspy({
+                target: ''
+            });
+            $(document.body).scrollspy('refresh');
+            if (enoughForAffixToc) {
+                toc.hide();
+                tocAffix.show();
+            } else {
+                tocAffix.hide();
+                toc.show();
+            }
+            $(document.body).scroll();
+        }
+
+        function windowResize() {
+            //toc right
+            var paddingRight = parseFloat(markdown.css('padding-right'));
+            var right = ($(window).width() - (markdown.offset().left + markdown.outerWidth() - paddingRight));
+            toc.css('right', right + 'px');
+            //affix toc left
+            var newbool;
+            var rightMargin = (markdown.parent().outerWidth() - markdown.outerWidth()) / 2;
+            //for ipad or wider device
+            if (rightMargin >= 133) {
+                newbool = true;
+                var affixLeftMargin = (tocAffix.outerWidth() - tocAffix.width()) / 2;
+                var left = markdown.offset().left + markdown.outerWidth() - affixLeftMargin;
+                tocAffix.css('left', left + 'px');
+            } else {
+                newbool = false;
+            }
+            if (newbool != enoughForAffixToc) {
+                enoughForAffixToc = newbool;
+                generateScrollspy();
+            }
+        }
+        $(window).resize(function () {
+            windowResize();
+        });
+        $(document).ready(function () {
+            windowResize();
+            generateScrollspy();
+        });
+
+        //remove hash
+        function removeHash() {
+            window.location.hash = '';
+        }
+
+        var backtotop = $('.back-to-top');
+        var gotobottom = $('.go-to-bottom');
+
+        backtotop.click(function (e) {
+            e.preventDefault();
+            e.stopPropagation();
+            if (scrollToTop)
+                scrollToTop();
+            removeHash();
+        });
+        gotobottom.click(function (e) {
+            e.preventDefault();
+            e.stopPropagation();
+            if (scrollToBottom)
+                scrollToBottom();
+            removeHash();
+        });
+
+        var toggle = $('.expand-toggle');
+        var tocExpand = false;
+
+        checkExpandToggle();
+        toggle.click(function (e) {
+            e.preventDefault();
+            e.stopPropagation();
+            tocExpand = !tocExpand;
+            checkExpandToggle();
+        })
+
+        function checkExpandToggle () {
+            var toc = $('.ui-toc-dropdown .toc');
+            var toggle = $('.expand-toggle');
+            if (!tocExpand) {
+                toc.removeClass('expand');
+                toggle.text('Expand all');
+            } else {
+                toc.addClass('expand');
+                toggle.text('Collapse all');
+            }
+        }
+
+        function scrollToTop() {
+            $('body, html').stop(true, true).animate({
+                scrollTop: 0
+            }, 100, "linear");
+        }
+
+        function scrollToBottom() {
+            $('body, html').stop(true, true).animate({
+                scrollTop: $(document.body)[0].scrollHeight
+            }, 100, "linear");
+        }
+    </script>
+</body>
+
+</html>