view final_main/chapter4.tex @ 24:5e0c566bba54

fix
author menikon
date Sat, 15 Feb 2020 17:10:19 +0900
parents 935e11c0f150
children d4c7ffd507a3
line wrap: on
line source

\chapter{xv6}
\section{xv6 の概要}
xv6 とは MIT のオペレーティングコースの教育目的で2006年に開発されたオペレーティングシステムである。xv6 はオリジナルである v6 が非常に古い C 言語で書かれてい る為、ANSI-C に書き換えられ x86 に再実装された。 xv6 は read や write などの systemcall、プロセス、仮想メモリ、カーネルとユーザーの分離、割り込み、ファイルシステムなど Unix の基本的な構造を持っている。
本研究で使われているのは ARM\cite{arm} 上で動作する Raspberry Pi 用に改良されたxv6を使用する。


\section{xv6 のFileSystem}
%どんなものか書く
FileSystem とは、コンピュータの資源を操作するための OS が持つ機能のことである。ファイルといえば記憶装置内に格納されている情報を指すが、xv6 の FileSystem は、デバイスやプロセス、カーネル内の処理をする際の情報などをファイルとして扱う。 OS ごとに利用している FileSystem は異なるが、一部の OS を除きほとんどの OS には FileSystem が存在する。
%processについて(軽く)
xv6 の FileSystem は図\ref{fig:xv6filesystem} のように7つの階層によって構成されている。

\newpage
\begin{figure}[ht]
     \begin{center}
     \includegraphics[width=50mm]{fig/FileSystemLayout.pdf}
     \end{center}
     \caption{xv6 の FileSystem Layer}
    \label{fig:xv6filesystem}
\end{figure}

%図\ref{fig:xv6filesystem} の各階層について説明する。
Disk 階層は、IDEハードドライブ上のブロックを読み書きする。
Buffer cache 階層はディスクブロックをキャッシュし、ブロックのアクセスの同期を取り、データが格納されている特定のブロックについて、複数のブロックが同時に変更を行っていないことを保証する。つまり、プロセス間の調停を行なっている。
Logging 階層は高位の階層のいくつかのブロックの更新操作をトランザクションとしてラップし、またクラッシュが発生した場合でも、ブロックがシステムの他の部分から見てそれらがひとつの操作に見えるように更新されるようにする。
inode階層は個々のファイルを提供している。各ファイルは一意の i-number とファイルのデータを保持するいくつかのブロックを持つ inode として表されている。
Directory 階層はいくつかのディレクトリを構成している。ディレクトリのinodeはディレクトリのエントリ列が含まれており、各エントリにはファイル名とi-numberが入っている。
Pathname 階層は、/usr/rtm/xv6/fs.cのような階層的なパスを構成している。
File descriptor 階層は Unixの資源をファイルとして表現し、コンソールのようなデバイスはもちろん、実際のファイルもファイルとして表現している。

\newpage
FileSytem は処理の際に Disk 階層のブロックを利用している。Disk 階層のブロックがどのように割り当てられているか図\ref{fig:filesystem}に示す。

\begin{figure}[ht]
     \begin{center}
     \includegraphics[width=150mm]{fig/xv6filesystemlayout.pdf}
     \end{center}
     \caption{Disk 階層 のブッロク割り当て}
    \label{fig:filesystem}
\end{figure}

boot sector はシステムを起動するためのものであるが、FileSystem がこのブロックを使用することはない。super block はブロックのファイルサイズやデータブロックの数,、inode の数,、log 中のブロック数などが格納されている。 inodes は inode に関するリストが格納されている。block bitmap は使用しているブロックが記憶されている。data blocks は  block bitmap において使用可能であることが記録されており、ファイルやディレクトリが保持されている。log は Logging 階層に関する情報が格納されている。

\section{FilleSystem の API} 
FileSystem について記述している fs.c ではファイルを操作、管理する際に様々な関数がプロセスやデバイスなどから呼び出され使用されている。
 fs.c に存在している関数とその挙動に関して具体的に以下に示す。
%関数や構造体などを解説しそのまま利用されているところをかく
%FileSystemの構造よりも重要だからこっちの方のを優先的に説明したい!
\begin{itemize}
  \item readsb
  \\ブロックのファイルサイズやデータブロックの数、inodeの数、log 中のブロック数などが格納されている Disk 階層の super block を読み込む。
  \item iinit
  \\ブート時にmain関数で呼び出され初期化される。
  %あやしい
  \item ialloc
  \\デバイスで指定されたタイプを新しい inode に割り当てる。
  \item iupdate
  \\変更されたメモリ内の inode をディスクにコピーする。
  \item idup
  \\IPの参照カウントをインクリメントする。
  \item ilock 
  \\指定した inode をロックする。またその際に必要であるならば、ディスクから inode を読み込む。
  \item iunlock
  \\指定された inode のロックを解除する。
  \item iput
  \\メモリ内の inode への参照を削除する。
  \item iunlockput
  \\指定された inode のロックを解除してから iput を実行する。
  \item stati
  \\inode から ファイルに関する統計情報を複製する。
  \item readi
  \\inode からデータを読み込む。 
  \item writei
  \\inode へデータを書き込む。
  \item namecmp
  \\const char *sとconst char *tとディレクトリサイズを比較し、結果を返している。ディレクトリを操作、管理する際に呼び出される。
  %要確認し
  \item dirlookup
  \\ディレクトリ内のディレクトリエントリを探す。
  \item dirlink
  \\新しいディレクトリエントリ(名前、inum)をディレクトリdpに書き込む。
  \item namei
  \\/usr/rtm/xv6/fs.cのような階層的なパスを構成する際の操作、管理時に呼び出される。
  %要訂正
  \item nameiparent
  \\/usr/rtm/xv6/fs.cのような階層的なパスを構成する際の操作、管理時に呼び出される。
\end{itemize}
%namecmp、dirlookup、dirlookup、dirlink、namei、nameiparent は/usr/rtm/xv6/fs.cのような階層的なパスを管理、操作するための API である。
ilock で inode をロックした場合必ず処理の終わりには iunlock が呼び出され inode のロックを解除する必要があるように、readi でinode からデータを読み込んだり iwrite で inode へデータを書き込む場合も iput で inode を参照必要がある。このように、FileSystem の API を利用する際様々な API 同士が影響を及ぼしあっている。