view paper/Paging.tex @ 42:0678e32fff26

xv.6 function
author tobaru
date Thu, 20 Feb 2020 17:24:28 +0900
parents 69ac4230c3f2
children
line wrap: on
line source

\chapter{CbCXv6 のメモリ管理} 
 OS の信頼性の基本である メモリ管理 の書き換えについて説明する。


\section{Xv6 を元にした Gears OS の実装}
Gears OS ではハードウェア上でメタレベルの計算や並列実行を行いたいので、
Raspberry Pi でもバイナリを出力できる Xv6 を CbC で書き換える。
ANSI-C で書かれている Xv6 を CbC に書き直し、それを元に Gears OS を実装していく。

\section{Paging}
実メモリをそのまま使うと様々な問題が生じる。
ユーザープログラム側で空いているメモリ番地を探す必要がでてきたり、メモリ間にデータとして扱うには小さな隙間ができるフラグメンテーションが起こる。
xv6 ではメモリ管理の手法の1つとして Paging を採用している。


Paging ではメモリを Page と呼ばれる固定長の単位に分割し、メモリとスワップ領域で Page を入れ替えて管理を行う。
Paging を扱うことでブロック単位で管理することによりフラグメンテーションが解消でき、MMUが実メモリを管理することによってプログラム側で空いているメモリを探す必要がなくなる。


% 図 \ref{fig:MemoryConstitution} で Xv6の仮想メモリと実メモリについて説明する。
% 図のRWX は読み込み、書き込み、実行の権限を表している。
% 
% 
%  \begin{figure}[ht]
%  \begin{center}
%   \includegraphics[width=160mm]{./fig/MemoryConstitution}
%  \end{center}
%  \caption{On the left, xv6’s kernel address space. RWX refer to PTE read, write, and execute
% permissions. On the right, the RISC-V physical address space that xv6 expects to see.\cite{xv6}} 
%  \label{fig:MemoryConstitution}
% \end{figure}

\section{xv6 の Paging の主要関数}
xv6 の Paging は vm.c で行われる。vm.c で使われる主要関数の役割について説明する。


\begin{description}
  \item[init\_vmm] : 最初に外部ファイルの main.c から呼び出される関数。lock に使う側の id を入れ、誰も使ってなければ 0 を入れる。
  \item[kpt\_free] : カーネルのメモリを解放する。 
  \item[kpt\_alloc] : メモリ割り当て。Page Table が NULL なら panic関数を呼び出す。
  \item[walkpgdir] : Page Table を探してアドレスを返す。loaduvm などの if文内で呼び出される。
  \item[loaduvm] : スワップ領域から呼び出され、カーネル内をループしながらユーザープロセスを待ち状態にする。
  \item[allocuvm] : 仮想メモリをユーザープロセスに割り当てる。
  \item[inituvm] : プロセス側である proc.c から呼び出され、Page ディレクトリを作成する。
\end{description}


\section{CbCXv6 での Paging}
 Context に必要な Page Table を提供する Interface が必要である。
% と User Space からアクセスする API が必要である。
Page Table に相当するデータを Input Data Gear で受け取って変更した後、Context にあるメモリコントロールを担当する Meta Data Gear に goto で遷移してアクセスする。 
% Meta Computation レベルで処理することで Use Spaceでも Page Table を操作することができる。
メタレベルで処理することで カーネル側の処理である Page Table を操作することができる。
% Meta Computation に戻る際に、
Page Table Entry のバリデーションをチェックして反映することで、他のプロセスから Page Table を書き換えられることを防ぐ。また、サンドボックスにしておいて、他のプロセスが書き換えられた時にエクセプションを飛ばすようにすることで信頼性の保証を行う。


\section{Paging の書き換え}
 Xv6 では実メモリ(Physical memory) から仮想メモリ(Virtual memory)の変換を vm.c で行なっている。
vm.c を CbC で書き換えていく。
次の章で実際の書き換えについて説明する。