# HG changeset patch # User mir3636 # Date 1549503928 -32400 # Node ID 52521f53f29da2dddf8f546bcd5f89a00c6fd59d # Parent ed7a29ed96b77467aaec9a5961d5c1c02bc03b71 update diff -r ed7a29ed96b7 -r 52521f53f29d paper/xv6.tex --- a/paper/xv6.tex Thu Feb 07 10:22:21 2019 +0900 +++ b/paper/xv6.tex Thu Feb 07 10:45:28 2019 +0900 @@ -22,9 +22,9 @@ ユーザープログラムがカーネルの提供するサービスを呼び出す際にはシステムコールを用いる。 ユーザープログラムがシステムコールを呼び出すと、トラップが発生する。 トラップが発生すると、ユーザープログラムは中断され、カーネルに切り替わり処理を行う。 -ソースコード \ref{syscall} は xv6 のシステムコールのリストである。 +ソースコード \ref{syscall_list} は xv6 のシステムコールのリストである。 -\begin{lstlisting}[frame=lrbt,label=syscall,caption={\footnotesize xv6 のシステムコールのリスト}] +\begin{lstlisting}[frame=lrbt,label=syscall_list,caption={\footnotesize xv6 のシステムコールのリスト}] static int (*syscalls[])(void) = { [SYS_fork] =sys_fork, [SYS_exit] =sys_exit, @@ -84,12 +84,39 @@ \section{xv6-rpi の CbC 対応} -オリジナルの Xv6 は x86 アーキテクチャで実装されたものだが、xv6-rpi は Raspberry Pi 用に実装されたものである。 -Xv6 の ARM への移植は フロリダ州立大学によって行われた。 +オリジナルの xv6 は x86 アーキテクチャで実装されたものだが、xv6-rpi は Raspberry Pi 用に実装されたものである。 xv6-rpi を CbC で書き換えるために、 -GCC 上で実装した CbC コンパイラを ARM 向けに build し xv6-rpi のクロスコンパイルを行い、 -QEMU 上で動作させた。 +GCC 上で実装した CbC コンパイラを ARM 向けに build し xv6-rpi をコンパイルした。 +これにより、 xv6-rpi を CbC で書き換えることができるようになった。 + +ソースコード \ref{syscall} は syscall() におけるシステムコールの呼び出しを行うコードである。 +システムコールはソースコード \ref{syscall_list} の関数のリストから呼び出される。 +CbC でも同様に num で指定された番号の cbccodes のリストの Code Gear へ goto する。 +引数に持つ cbc\_ret は 継続した先でトラップに戻ってくるための Code Gear である。 + +\begin{lstlisting}[frame=lrbt,label=syscall,caption={\footnotesize syscall()}] + if((num >= NELEM(syscalls)) && (num <= NELEM(cbccodes)) && cbccodes[num]) { + proc->cbc_arg.cbc_console_arg.num = num; + goto (cbccodes[num])(cbc_ret); + } + + + if((num > 0) && (num <= NELEM(syscalls)) && syscalls[num]) { + ret = syscalls[num](); + + // in ARM, parameters to main (argc, argv) are passed in r0 and r1 + // do not set the return value if it is SYS_exec (the user program + // anyway does not expect us to return anything). + if (num != SYS_exec) { + proc->tf->r0 = ret; + } + } +\end{lstlisting} + + + +