\subsubsection{仮想記憶管理}

元の μ ITRON 3.0 仕様では、仮想記憶についての仕様は規定してありません。

\begin{table}[htbp]
  \begin{center}
    \leavevmode
    \caption{仮想記憶管理操作関数一覧}

    \begin{tabular}[h]{l p{10cm}} \hline 
      \multicolumn{1}{c}{システムコール名} &
      \multicolumn{1}{c}{機能} \\ \hline \hline
%
      vcre\_reg  &      リージョンの生成              \\
      vdel\_reg  &      リージョンの削除              \\
      vmap\_reg  &      リージョンのマップ            \\
      vunm\_reg  &      リージョンのアンマップ        \\
      vdup\_reg  &      リージョンの複製を作る        \\
      vprt\_reg  &      リージョンのプロテクト情報の設定 \\
      vshr\_reg  &      タスク間でのリージョンの共有  \\
      vput\_reg  &      リージョンへの書き込み        \\
      vget\_reg  &      リージョンからの読み込み      \\
      vsts\_reg  &      リージョンの情報              \\
    \end{tabular}
  \end{center}
  \label{tab:virtual-syscall}
\end{table}

\newpage
\function{vcre\_reg --- リージョンの生成}

\begin{lablist}
  
\labitem{呼び出し形式}

{\tt ER vcre\_reg (id, start, min, max, perm, handle)}

\labitem{引数}

\begin{lablist}
\labitem {id}         リージョンを生成するタスク
\labitem {start}      リージョンの先頭仮想アドレス
\labitem {min}        リージョンの最小サイズ(初期サイズ)
\labitem {max}        リージョンの最大サイズ
\labitem {perm}       リージョンの permission
\labitem {handle}     マップされていない仮想ページにアクセスした時の処
                      理を指定する 
\end{lablist}

\labitem{機能}

引数に指定したとおりの新しいリージョンを作成する。

新しく作成したリージョンは、引数 id で指定したタスクに結びつける。

もし、引数で指定した仮想アドレス領域にすでに別のリージョンが存在した場
合にはエラーとなる。 

なお、このシステムコールを発行した時点では、仮想メモリだけが確保され実
メモリはマッピングされない。

\labitem{返り値}

以下のエラー番号が返る。


\begin{lablist}
\labitem {E\_OK}     リージョンの確保に成功  
\labitem {E\_NOMEM}  メモリが不足している
\labitem {E\_ID}     引数で指定したタスク ID が不正
\labitem {E\_NOSPT}  本システムコールは、未サポート機能である
\labitem {E\_OBJ}    すでに別のリージョンが仮想アドレス領域上に存在している
\end{lablist}

\end{lablist}

\newpage

\function{vdel\_reg --- リージョンの削除}

\begin{lablist}

\labitem{呼び出し形式}

{\tt ER vdel\_reg (id, start) }

\labitem{引数}

\begin{lablist}
  \labitem{id}     削除するリージョンをもつタスク
  \labitem{start}  削除するリージョンの先頭アドレス
\end{lablist}

\labitem{返り値}

以下のエラー番号が返る。

\begin{lablist}
\labitem {E\_OK}     リージョンの削除に成功  
\labitem {E\_ID}     引数 id に対応するタスクが存在しない
\labitem {E\_NOSPT}  本システムコールは、未サポート機能である
\end{lablist}


\labitem{機能}

引数 start で指定したアドレス領域を管理するリージョンを削除する。
削除したリージョンに含まれる領域中のデータは破棄する。

start の値で指定したアドレスは、リージョンの先頭アドレスである必要はな
い。リージョン内のアドレスならば、どのリージョンを指定したかをシステム
コール内で判断する。
\end{lablist}

\newpage

\function {vmap\_reg --- リージョンのマップ}            

\begin{lablist}

\labitem{呼び出し形式}

{\tt ER vmap\_reg (id, start, size)}

\labitem{引数}

\begin{lablist}
  \labitem{id}        タスク ID
  \labitem{start}     マップする仮想メモリ領域の先頭アドレス
  \labitem{size}      マップする仮想メモリ領域の大きさ(バイト単位)
\end{lablist}

\labitem{返り値}

以下のエラー番号が返る。

\begin{lablist}
  \labitem {E\_OK}     リージョンのマップに成功  
  \labitem{E\_NOMEM}  (物理)メモリが不足している
  \labitem {E\_NOSPT}  本システムコールは、未サポート機能である。
\end{lablist}


\labitem{機能}

引数で指定したアドレス領域に物理メモリを割り付ける。

複数のページに相当するサイズが指定された場合、全て
のページがマップ可能のときのみ物理メモリを割り付け
る。その他の場合は割り付けない。

マップする物理メモリのアドレスは指定できない。中心核が仮想メモリに割り
付ける物理メモリを適当に割り振る。

\end{lablist}

\newpage
\function {vunm\_reg --- リージョンのアンマップ}        

\begin{lablist}

\labitem{呼び出し形式}

{\tt Er vunm\_reg (id, addr, size)}


\labitem{引数}

\begin{lablist}
  \labitem {id}   リージョンをもつタスク
  \labitem {addr} アンマップする仮想メモリ領域の先頭アドレス
  \labitem {size} アンマップする仮想メモリ領域のサイズ(バイト単位)
\end{lablist}

\labitem{返り値}

以下のエラー番号が返る。

\begin{lablist}
\labitem {E\_OK}     アンマップに成功  
\labitem {E\_ID}     引数 id に対応するタスクが存在しない
\labitem {E\_NOSPT}  本システムコールは、未サポート機能である
\end{lablist}


\labitem{機能}

引数 id で指定したタスクに附属するリージョンの物理メモリのマップを
解除する。

物理メモリの内容は、破棄される。

\end{lablist}

\newpage
\function {vdup\_reg --- リージョンの複製を作る}        

\begin{lablist}

\labitem{呼び出し形式}

{\tt ER vdup\_reg (src, dst, start)}


\labitem{引数}

\labitem{引数}

\begin{lablist}
  \labitem{src}    複製するリージョンをもつタスク
  \labitem{dst}    リージョンの複製先のタスク
  \labitem{start}  複製するリージョンの先頭アドレス
\end{lablist}


\labitem{返り値}

以下のエラー番号が返る。

\begin{lablist}
\labitem {E\_OK}     リージョンの複製に成功  
\labitem {E\_NOSPT}  本システムコールは、未サポート機能である。
\end{lablist}


\labitem{機能}

指定したタスクのもつリージョンを複製する。

複製したリージョンは、全く別のものとして扱われる。
src, dst のどちらかのタスクがリージョンの領域を変更しても、もう片方の
タスクは影響を受けない。

\end{lablist}

\newpage
\function {vprt\_reg --- リージョンのプロテクト情報の設定} 

\begin{lablist}

\labitem{呼び出し形式}

{\tt ER vprt\_reg (id, start, prot)}


\labitem{引数}

\begin{lablist}
  \labitem{id}     リージョンをもつタスク
  \labitem{start}  リージョンの先頭仮想アドレス
  \labitem{prot}   プロテクト情報
\end{lablist}

\labitem{返り値}

以下のエラー番号が返る。

\begin{lablist}
\labitem {E\_OK}     リージョンのプロテクト情報の設定に成功  
\labitem {E\_NOSPT}  本システムコールは、未サポート機能である。
\end{lablist}


\labitem{機能}

リージョンに含まれるすべての仮想メモリページのプロテクト情報を設定する。

プロテクト情報としては以下の値が指定できる。

\begin{description}
\item[VPROT\_READ]    読み込み可能
\item[VPROT\_WRITE]   書き込み可能
\item[VPROT\_EXEC]    実行可能
\end{description}

\end{lablist}

\newpage
\function {vshr\_reg --- タスク間でのリージョンの共有}  

\begin{lablist}

\labitem{呼び出し形式}

{\tt ER vshr\_reg (src, dst, start)}


\labitem{引数}

\begin{lablist}
  \labitem{src}    共有元のリージョンをもつタスク
  \labitem{dst}    新たにリージョンを共有するタスク
  \labitem{start}  リージョンの先頭アドレス
\end{lablist}

\labitem{返り値}

以下のエラー番号が返る。

\begin{lablist}
\labitem {E\_OK}     リージョンの共有に成功  
\labitem {E\_NOSPT}  本システムコールは、未サポート機能である。
\end{lablist}


\labitem{機能}

引数 src で指定したタスクのもつリージョンを引数 dst で指定したタスクに
割り当てる。割りあてたリージョンは共有される。

共有されたリージョンに含まれる仮想アドレス領域には、タスク間で同じ物理
アドレスを割り当てる。そのため、片方のタスクが仮想アドレス領域内の情報
を変更した場合、他方のタスクにも反映される。

\end{lablist}

\newpage
\function {vput\_reg --- リージョンへの書き込み}        

\begin{lablist}

\labitem{呼び出し形式}

{\tt ER vput\_reg (id, start, size, buf) }

\labitem{引数}

\begin{lablist}
  \labitem{id}     リージョンを持つタスク
  \labitem{start}  書き込む領域の先頭アドレス
  \labitem{size}   リージョンに書き込むサイズ
  \labitem{buf}    リージョンに書き込むデータ
\end{lablist}

\labitem{返り値}

以下のエラー番号が返る。

\begin{lablist}
\labitem {E\_OK}     リージョンへの書き込みに成功  
\labitem {E\_ID}     引数 id に対応したタスクは存在しない
\labitem {E\_NOSPT}  本システムコールは、未サポート機能である
\end{lablist}


\labitem{機能}

任意のタスクの仮想メモリ領域にデータを書き込む。

ページインなどに使用できる。


\end{lablist}

\newpage
\function {vget\_reg --- リージョンからの読み込み}      

\begin{lablist}

\labitem{呼び出し形式}

{\tt ER vput\_reg (id, start, size, buf) }

\labitem{引数}

\begin{lablist}
  \labitem{id}     リージョンを持つタスク
  \labitem{start}  読み込む領域の先頭アドレス
  \labitem{size}   リージョンから読み込むサイズ
  \labitem{buf}    リージョンから読み込んだデータを収めるバッファ
\end{lablist}


\labitem{返り値}

以下のエラー番号が返る。

\begin{lablist}
\labitem {E\_OK}     成功  
\labitem {E\_ID}     リージョンをもつタスク
\labitem {E\_NOSPT}  本システムコールは、未サポート機能である
\end{lablist}

\labitem{機能}

任意のタスクの仮想メモリ領域からデータを読み込む。

ページアウトなどに使用できる。


\end{lablist}

\newpage
\function {vsts\_reg --- リージョンの情報}              

\begin{lablist}

\labitem{呼び出し形式}

{\tt ER vsts\_reg (id, start, stat)}

\labitem{引数}

\begin{lablist}
  \labitem{id}     リージョンをもつタスク
  \labitem{start}  リージョンの先頭アドレス
  \labitem{stat}   リージョン情報が入る(リージョン情報の詳細は未決定である)
\end{lablist}

\labitem{返り値}

以下のエラー番号が返る。

\begin{lablist}
\labitem {E\_OK}     リージョンの情報の取得に成功  
\labitem {E\_ID}     引数 id で指定したタスクは存在しない
\labitem {E\_NOSPT}  本システムコールは、未サポート機能である
\end{lablist}


\labitem{機能}

リージョンの情報を取得する。

リージョン情報としては次のものが考えられる。

\begin{itemize}
\item リージョンの先頭仮想アドレス
\item リージョンのサイズ
\item プロテクト情報
\end{itemize}

\end{lablist}
