changeset 31:24f476d2259e

update
author mir3636
date Wed, 06 Feb 2019 15:54:29 +0900
parents d5bca3bca59c
children 2c3f12ef8f76
files paper/master_paper.pdf paper/src/Stack.cbc paper/xv6.tex
diffstat 3 files changed, 37 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
Binary file paper/master_paper.pdf has changed
--- a/paper/src/Stack.cbc	Mon Feb 04 18:47:41 2019 +0900
+++ b/paper/src/Stack.cbc	Wed Feb 06 15:54:29 2019 +0900
@@ -6,9 +6,9 @@
     __code clear(Impl* stack,__code next(...));
     __code push(Impl* stack,union Data* data, __code next(...));
     __code pop(Impl* stack, __code next(union Data*, ...));
-    __code pop2(Impl* stack, union Data** data, union Data** data1, __code next(union Data**, union Data**, ...));
+    __code pop2(Impl* stack, __code next(union Data*, union Data*, ...));
     __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...));
-    __code get(Impl* stack, union Data** data, __code next(...));
-    __code get2(Impl* stack,..., __code next(...));
+    __code get(Impl* stack, __code next(union Data*, ...));
+    __code get2(Impl* stack, __code next(union Data*, union Data*, ...));
     __code next(...);
 } Stack;
--- a/paper/xv6.tex	Mon Feb 04 18:47:41 2019 +0900
+++ b/paper/xv6.tex	Wed Feb 06 15:54:29 2019 +0900
@@ -4,10 +4,41 @@
 xv6 は UNIX V6 を x86 へ再実装したものであるが、
 ここでは Xv6 を Raspberry pi 用に移植した xv6\_rpi\cite{xv6rpi} を用いて実装する。
 
+Xv6 は 2006 年に MIT のオペレーティングシステムコースで教育用の目的として開発されたオペレーティングシステムである。
+Xv6 はプロセス、仮想メモリ、カーネルとユーザの分離、割り込み、ファイルシステムなどの基本的な Unix の構造を持つにも関わらず、
+シンプルで学習しやすい。
+
+\section{Xv6 の構成要素}
+xv6 はカーネルと呼ばれる形式をとっている。
+カーネルは OS にとって中核となるプログラムである。
+xv6 ではカーネルとユーザープログラムは分離されており、カーネルはプログラムにプロセス管理、メモリ管理、I/O やファイルの管理などのサービスを提供する。
+ユーザープログラムがカーネルのサービスを呼び出す場合、システムコールを用いてユーザー空間からカーネル空間へ入りサービスを実行する。
+カーネルは CPU のハードウェア保護機構を使用して、ユーザー空間で実行されているプロセスが自身のメモリのみアクセスできるように保護している。
+ユーザープログラムがシステムコールを呼び出すと、ハードウェアが特権レベルを上げ、カーネルのプログラムが実行される。
+この特権レベルを持つプロセッサの状態をカーネルモード、特権のない状態をユーザーモードという。
+
+\subsubsection{プロセス}
+プロセスとは、カーネルが実行するプログラムの単位である。
+xv6 のプロセスは、ユーザー空間メモリとカーネル用のプロセスの状態を持つ空間で構成されている。
+プロセスは独立しており、他のプロセスからメモリを破壊されたりすることはない。
+また、独立していることでカーネルそのものを破壊することもない。
+各プロセスの状態は struct proc によって管理されている。
+プロセスは fork システムコールによって新たに生成される。
+fork は新しく、親プロセスと呼ばれる呼び出し側と同じメモリ内容の、子プロセスと呼ばれるプロセスを生成する。
+fork システムコールは、親プロセスであれば子プロセスのID、子プロセスであれば 0 を返す。
+親プロセスと子プロセスは最初は同じ内容を持っているが、それぞれ異なるメモリ、レジスタで実行されているため、片方のメモリ内容を変更してももう片方に影響はない。
+exit システムコールはプロセスの停止を行い、メモリを解放する。
+wait システムコールは終了した子プロセスのIDを返す。子プロセスが終了するまで待つ。
+exec システムコールは呼び出し元のプロセスのメモリをファイルシステムのファイルのメモリイメージと置き換え実行する。
+ファイルには命令、データなどの配置が指定されたフォーマット通りになっていなければならない。
+xv6 は ELF と呼ばれるフォーマットを扱う。
+
+\subsubsection{ファイルディスクリプタ}
+ファイルディスクリプタは、カーネルが管理するプロセスが読み書きを行うオブジェクトを表す整数値である。
+プロセスは、ファイル、ディレクトリ、デバイスを開く、または既存のディスクリプタを複製することによって、
+ファイルディスクリプタを取得する。
+
 \section{xv6-rpi の CbC 対応}
-Xv6 は 2006 年に MIT のオペレーティングシステムコースで教育用の目的として開発されたオペレーティングシステムである。
-Xv6 はプロセス、仮想メモリ、カーネルとユーザの分離、割り込み、ファイルシステムなどの Unix の構造を持つにも関わらず、
-シンプルで学習しやすい。
 
 オリジナルの Xv6 は x86 アーキテクチャで実装されたものだが、xv6-rpi は Raspberry Pi 用に実装されたものである。
 Xv6 の ARM への移植は フロリダ州立大学によって行われた。