投稿日
2012/2/29 水曜日
テキストの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, };
前々回感想に「例外でも割り込みが発生するし、システムコールでも発生するし、デバイスからも発生するということみたいです。」と書きました。
システムコールの呼び出しの処理を見ると、割り込みと例外にも同じような処理が流用出来る風な事がここでも書いてあり、やはりそのあたりは関連してるみたいですね。
最近のコメント
名前
しゅごい
Jane Doe
FYI Avoid Annoying Unexpe…
Jane Doe
ご存じとは思いますが、whileには、”~の間”と…
peta_okechan
針金みたいなパーツを引っ張ると外れます。 他の方の…
虎徹ファン交換
虎徹の標準ファンを外す際に、どのようにして外されま…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…