Mercurial > hg > Papers > 2020 > tobaru-master
view paper/Xv6.tex @ 42:0678e32fff26
xv.6 function
author | tobaru |
---|---|
date | Thu, 20 Feb 2020 17:24:28 +0900 |
parents | 8ab113a99ea3 |
children | 25b7e00fddc6 |
line wrap: on
line source
\chapter{xv6} xv6 とは、マサチューセッツ工科大の大学院生向け講義の教材として使うために、UNIX V6 という OS を ANSI-C(規格化されたC言語) に書き換え、x86 に移植した Xv6 OS である。 本研究では、この xv6 を参考に Gears OS の開発を行なっている。 \section{Kernel Space と User Space} Xv6 は Kernel を採用している。 Kernel は OS にとって中核となるプログラムである。 Xv6 では Kernel と User プログラムは分離されており、kernel はプログラムにプロセス管理、メモリ管理、I/O やファイルの管理などのサービスを提供する。 User プログラムは kernel に直接アクセスできない。これは重要なファイルを書き換えられたり、アクセスされるのを防ぐためだと考えられる。 User プログラムが Kernel のサービスを呼び出す場合、system call を用いて User Space から Kernel Space Space へ入り実行される。Kernel は CPU のハードウェア保護機構を使用して、 User Space で実行されているプロセスが自身のメモリのみアクセスできるように保護している。 User プログラムが system call をすると、ハードウェアが一時的に特権レベルを上げ、kernel のプログラムが実行される。この特権レベルを持つプロセッサの状態を kernel モード、特権のない状態を User モードと言う。 \section{system call} User プログラムが Kernel の処理を行う場合、system call を用いる。 User プログラムが system call を呼び出すと、トラップが発生する。 トラップが発生すると、User プログラムは中断され、Kernel に切り替わり処理を行う。Xv6 のsystem call のリストを \ref{syscall_list} に示す。 \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, [SYS_wait] =sys_wait, [SYS_pipe] =sys_pipe, [SYS_read] =sys_read, [SYS_kill] =sys_kill, [SYS_exec] =sys_exec, [SYS_fstat] =sys_fstat, [SYS_chdir] =sys_chdir, [SYS_dup] =sys_dup, [SYS_getpid] =sys_getpid, [SYS_sbrk] =sys_sbrk, [SYS_sleep] =sys_sleep, [SYS_uptime] =sys_uptime, [SYS_open] =sys_open, [SYS_write] =sys_write, [SYS_mknod] =sys_mknod, [SYS_unlink] =sys_unlink, [SYS_link] =sys_link, [SYS_mkdir] =sys_mkdir, [SYS_close] =sys_close, }; \end{lstlisting} \section{Xv6-rpi} Xv6 は Arm のバイナリを出力するので、シングルボードコンピュータである Raspberry Pi や携帯電話など様々なハードウェアで動かすことができる。 実際に Raspberry Pi 上で動かすために xv6-rpi\cite{xv6rpi} という OS を用意して動作しているか検証中である。 xv6-rpi は CbCXv6 と別で用意している。