changeset 35:52521f53f29d

update
author mir3636
date Thu, 07 Feb 2019 10:45:28 +0900
parents ed7a29ed96b7
children 68f10de82b87
files paper/xv6.tex
diffstat 1 files changed, 33 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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}
+
+
+
+