技術

[xv6 #24] Chapter 2 – Traps, interrupts, and drivers – Code: The first system call

テキストの33〜34ページ

本文

前の章は、initcode.Sがシステムコールを呼び出すところで終わった。
もう一回そこを見てよう。
(initcode.Sの最初のint $T_SYSCALLのところ)
プロセスは、execを呼ぶための引数をそのプロセスのスタックにプッシュし、%eaxにシステムコール番号をセットする。
システムコール番号は、関数ポインタのテーブルであるsyscallの配列のエントリのどれかを指す。
(syscall.hとsyscall.cの関数ポインタテーブルを参照)
我々は、int命令がユーザモードからカーネルモードへ切り替え、カーネルが正しいカーネルの関数(例えばsys_exec)を呼び出し、カーネルがsys_execの引数を回復出来る手はずを整える必要がある。
次のいくつかの節で、システムコールのためのそれをxv6がどうやって手はずを整えるか説明する。
そうしたら割り込みと例外のために同じコードが再利用出来ることを我々は発見するだろう。

initcode.S

# Initial process execs /init.

#include "syscall.h"
#include "traps.h"


# exec(init, argv)
.globl start
start:
  pushl $argv
  pushl $init
  pushl $0  // where caller pc would be
  movl $SYS_exec, %eax
  int $T_SYSCALL

# for(;;) exit();
exit:
  movl $SYS_exit, %eax
  int $T_SYSCALL
  jmp exit

# char init[] = "/init\0";
init:
  .string "/init\0"

# char *argv[] = { init, 0 };
.p2align 2
argv:
  .long init
  .long 0

syscall.h

// System call numbers
#define SYS_fork    1
#define SYS_exit    2
#define SYS_wait    3
#define SYS_pipe    4
#define SYS_read    5
#define SYS_kill    6
#define SYS_exec    7
#define SYS_fstat   8
#define SYS_chdir   9
#define SYS_dup    10
#define SYS_getpid 11
#define SYS_sbrk   12
#define SYS_sleep  13
#define SYS_uptime 14

#define SYS_open   15
#define SYS_write  16
#define SYS_mknod  17
#define SYS_unlink 18
#define SYS_link   19
#define SYS_mkdir  20
#define SYS_close  21

syscall.cの関数ポインタテーブル

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,
};

感想

前々回感想に「例外でも割り込みが発生するし、システムコールでも発生するし、デバイスからも発生するということみたいです。」と書きました。
システムコールの呼び出しの処理を見ると、割り込みと例外にも同じような処理が流用出来る風な事がここでも書いてあり、やはりそのあたりは関連してるみたいですね。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください