Mercurial > hg > Papers > 2020 > tobaru-master
changeset 36:8ab113a99ea3
interface flow and fix
author | tobaru |
---|---|
date | Thu, 13 Feb 2020 21:48:07 +0900 |
parents | 455e756bfe1a |
children | 619146ed8fb4 |
files | paper/Xv6.tex paper/cbc_interface.tex paper/fig/interface.graffle paper/fig/interface.pdf paper/master_paper.pdf paper/master_paper.synctex.gz paper/memory_manage.tex paper/src/vm_impl.cbc paper/src/vm_impl_createimpl.cbc |
diffstat | 9 files changed, 74 insertions(+), 57 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/Xv6.tex Thu Feb 13 18:54:48 2020 +0900 +++ b/paper/Xv6.tex Thu Feb 13 21:48:07 2020 +0900 @@ -1,9 +1,9 @@ -\chapter{x.v6} - x.v6 とは、マサチューセッツ工科大の大学院生向け講義の教材として使うために、UNIX V6 という OS を ANSI-C(規格化されたC言語) に書き換え、x86 に移植した Xv6 OS である。 +\chapter{xv6} + xv6 とは、マサチューセッツ工科大の大学院生向け講義の教材として使うために、UNIX V6 という OS を ANSI-C(規格化されたC言語) に書き換え、x86 に移植した Xv6 OS である。 -本研究では、この Xv6 を参考に Gears OS の開発を行なっている。 +本研究では、この xv6 を参考に Gears OS の開発を行なっている。 \section{Kernel Space と User Space} Xv6 は Kernel を採用している。 Kernel は OS にとって中核となるプログラムである。 @@ -20,7 +20,7 @@ \ref{syscall_list} に示す。 -\begin{lstlisting}[frame=lrbt,label=syscall_list,caption={\footnotesize x.v6 のシステムコールのリスト\cite{mitsuki-master}}] +\begin{lstlisting}[frame=lrbt,label=syscall_list,caption={\footnotesize xv6 のシステムコールのリスト\cite{mitsuki-master}}] static int (*syscalls[])(void) = { [SYS_fork] =sys_fork, [SYS_exit] =sys_exit,
--- a/paper/cbc_interface.tex Thu Feb 13 18:54:48 2020 +0900 +++ b/paper/cbc_interface.tex Thu Feb 13 21:48:07 2020 +0900 @@ -9,7 +9,7 @@ % Xv6 の書き換えは Interface を用いてモジュール化する。 -そうすることで Gears OS の機能を置き換えることできるようになる。 +Interface を使って記述することで Gears OS の機能を置き換えることできるようになる。 @@ -55,33 +55,49 @@ インターフェースは Data Gear に対しての Code Gear とその Code Gear で扱われている Data Gear の集合を抽象化した Meta Data Gear で、vm.c に対応する実装は別で定義する。 - -インターフェースの実装についてソースコード \ref{impl_vm} で示す。 +\section{インターフェースの実装の初期化} +インターフェースの定義が終わったので次にインターフェースの使うための初期化についてソースコード \ref{create_impl} で示す。 -\lstinputlisting[frame=lrbt,label=impl_vm,caption={\footnotesize vm インターフェースの実装}]{./src/vm_impl.cbc} +\lstinputlisting[frame=lrbt,label=create_impl,caption={\footnotesize vm インターフェースの初期化(vm\_impl.cbc)}]{./src/vm_impl_createimpl.cbc} 2行目のようにインターフェースのヘッダーファイルは \#include ではなく \#interface で呼び出す。 -create\_impl の関数内で、インターフェースを vm で定義し、23行目の vm-$>$void\_ret のようにそれぞれの Code Gear 名に対応させていく。 +create\_impl で、インターフェースを vm で定義する。 +5行目で new vm() することでメモリ上にインターフェースの置き場所を確保。vm\_impl も同じようにすることで実装の置き場所を確保し、7行目でインターフェースと実装を紐付ける。 + + +23行目の vm-$>$void\_ret のようにそれぞれの Code Gear 名を enum の番号で代入していく。 +enum の番号を使う事で、ポインタによる誤ったアクセスを防ぐことができる。 + -CbCは1つ1つの Code Gear の信頼性を保障させるために細かくする必要があるので、for文やif文がある場合はさらに実装を分ける。vm と同じように vm\_impl を定義し、遷移する関数名に対応させていく。分けた実装はさらに別で実装する(vm\_impl\_private.cbc)。 +\section{インターフェース の実装} +初期化したインターフェースの実装の例を説明する。 +ソースコード \ref{create_impl} の24行目 C\_init\_vmmvm\_impl が \ref{impl_vm} + の 6行目の init\_vmmvm\_impl に対応する。 + +\lstinputlisting[frame=lrbt,label=impl_vm,caption={\footnotesize vm インターフェースの使用(vm\_impl.cbc)}]{./src/vm_impl.cbc} + + +\section{インターフェース実装内の明示的な遷移の処理} +CbCは状態遷移ベースで記述するため、for文やif文がある場合はさらに実装を分ける。 +vm と同じように vm\_impl を定義し、遷移する関数名に対応させていく。分けた実装はさらに別で実装する(vm\_impl\_private.cbc)。 + +インターフェースの定義、実装、明示的な遷移の流れを図\ref{fig:interface} に示す。 + \begin{figure}[ht] + \begin{center} + \includegraphics[width=160mm]{./fig/interface} + \end{center} + \caption{インターフェースの実装の流れ} + \label{fig:interface} +\end{figure} % インターフェースを呼び出す場合は、struct vm* vm = createvm_impl(cbc_context); - - - - - - - - -\section{インターフェースの実装} インターフェースで定義した Code Gear 以外の Code Gaer も記述することができる。 この Code Gear は基本的にインターフェースで指定された Code Gear 内からのみ継続されるため、 Java の private メソッドのように扱われる。
--- a/paper/memory_manage.tex Thu Feb 13 18:54:48 2020 +0900 +++ b/paper/memory_manage.tex Thu Feb 13 21:48:07 2020 +0900 @@ -26,7 +26,7 @@ CbC を使って 信頼性の保証と拡張性を持たせる Gears OS\cite{gears} の開発を行なっている。 本論文では、 % 資源管理を行える CbC で軽量なハードウェアでも動かせるように Arm のバイナリを出力する -x.v6\cite{xv6} という OS を参考にした Geas OS の書き換えの説明を行う。 +xv6\cite{xv6} という OS を参考にした Geas OS の書き換えの説明を行う。 OS の信頼性の基本であるメモリ管理部分を書き換えることで信頼性を保証したい。 具体的にはPage のバリデーションチェックによる不正なデータの変更やサンドボックスによるエクセプションを飛ばすなどが挙げられる。 また、Gears OS のメタレベルとノーマルレベルでは書き換えなどを防ぐために見えるデータに違いが生じ、Code Gear と Meta Code Gear の記述も煩雑になる。それを解消するために、インターフェースによるモジュール化を導入\cite{mitsuki-master}した。
--- a/paper/src/vm_impl.cbc Thu Feb 13 18:54:48 2020 +0900 +++ b/paper/src/vm_impl.cbc Thu Feb 13 21:48:07 2020 +0900 @@ -1,40 +1,3 @@ -#include "../../context.h" -#interface "vm.h" - -vm* createvm_impl(struct Context* cbc_context) { - struct vm* vm = new vm(); - struct vm_impl* vm_impl = new vm_impl(); - vm->vm = (union Data*)vm_impl; - vm_impl->vm_impl = NULL; - vm_impl->i = 0; - vm_impl->pte = NULL; - vm_impl->sz = 0; - vm_impl->loaduvm_ptesize_check = C_loaduvm_ptesize_checkvm_impl; - vm_impl->loaduvm_loop = C_loaduvm_loopvm_impl; - vm_impl->allocuvm_check_newsz = C_allocuvm_check_newszvm_impl; - vm_impl->allocuvm_loop = C_allocuvm_loopvm_impl; - vm_impl->copyuvm_check_null = C_copyuvm_check_nullvm_impl; - vm_impl->copyuvm_loop = C_copyuvm_loopvm_impl; - vm_impl->uva2ka_check_pe_types = C_uva2ka_check_pe_types; - vm_impl->paging_intvm_impl = C_paging_intvmvm_impl; - vm_impl->copyout_loopvm_impl = C_copyout_loopvm_impl; - vm_impl->switchuvm_check_pgdirvm_impl = C_switchuvm_check_pgdirvm_impl; - vm_impl->init_inituvm_check_sz = C_init_inituvm_check_sz; - vm->void_ret = C_vm_void_ret; - vm->init_vmm = C_init_vmmvm_impl; - vm->kpt_freerange = C_kpt_freerangevm_impl; - vm->kpt_alloc = C_kpt_allocvm_impl; - vm->switchuvm = C_switchuvmvm_impl; - vm->init_inituvm = C_init_inituvmvm_impl; - vm->loaduvm = C_loaduvmvm_impl; - vm->allocuvm = C_allocuvmvm_impl; - vm->clearpteu = C_clearpteuvm_impl; - vm->copyuvm = C_copyuvmvm_impl; - vm->uva2ka = C_uva2kavm_impl; - vm->copyout = C_copyoutvm_impl; - vm->paging_int = C_paging_intvm_impl; - return vm; -} extern struct { struct spinlock lock; struct run *freelist;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/vm_impl_createimpl.cbc Thu Feb 13 21:48:07 2020 +0900 @@ -0,0 +1,38 @@ +#include "../../context.h" +#interface "vm.h" + +vm* createvm_impl(struct Context* cbc_context) { + struct vm* vm = new vm(); + struct vm_impl* vm_impl = new vm_impl(); + vm->vm = (union Data*)vm_impl; + vm_impl->vm_impl = NULL; + vm_impl->i = 0; + vm_impl->pte = NULL; + vm_impl->sz = 0; + vm_impl->loaduvm_ptesize_check = C_loaduvm_ptesize_checkvm_impl; + vm_impl->loaduvm_loop = C_loaduvm_loopvm_impl; + vm_impl->allocuvm_check_newsz = C_allocuvm_check_newszvm_impl; + vm_impl->allocuvm_loop = C_allocuvm_loopvm_impl; + vm_impl->copyuvm_check_null = C_copyuvm_check_nullvm_impl; + vm_impl->copyuvm_loop = C_copyuvm_loopvm_impl; + vm_impl->uva2ka_check_pe_types = C_uva2ka_check_pe_types; + vm_impl->paging_intvm_impl = C_paging_intvmvm_impl; + vm_impl->copyout_loopvm_impl = C_copyout_loopvm_impl; + vm_impl->switchuvm_check_pgdirvm_impl = C_switchuvm_check_pgdirvm_impl; + vm_impl->init_inituvm_check_sz = C_init_inituvm_check_sz; + vm->void_ret = C_vm_void_ret; + vm->init_vmm = C_init_vmmvm_impl; + vm->kpt_freerange = C_kpt_freerangevm_impl; + vm->kpt_alloc = C_kpt_allocvm_impl; + vm->switchuvm = C_switchuvmvm_impl; + vm->init_inituvm = C_init_inituvmvm_impl; + vm->loaduvm = C_loaduvmvm_impl; + vm->allocuvm = C_allocuvmvm_impl; + vm->clearpteu = C_clearpteuvm_impl; + vm->copyuvm = C_copyuvmvm_impl; + vm->uva2ka = C_uva2kavm_impl; + vm->copyout = C_copyoutvm_impl; + vm->paging_int = C_paging_intvm_impl; + return vm; +} +