投稿日
2012/3/8 木曜日
テキストの42ページ
1. 最初のシステムコールをキャッチするために、syscall()の最初の命令にブレークポイントをセットしなさい。
(例えば、GDBのbr syscallコマンドを使って)
この時点のスタック上の値は何か?
このブレークポイントにおけるx/37x $espの出力を、何のためのものかラベル付けして説明しなさい。
(例えば、%ebpはtrap, trapframe.eip, 作業用スペース等)
2. 新たにシステムコールを追加しなさい。
3. ネットワークドライバを追加しなさい。
1. について
コンパイル〜GDBによる追跡の方法についてはその0とその20を参照。
GDBでx/37x $espをやった時点のスクリーンショットはこんな感じです。
GDBの出力の重要な部分をテキストで抜き出すと、
(gdb) info frame Stack level 0, frame at 0x8dffff60: eip = 0x8010516f in syscall (syscall.c:128); saved eip 0x801063ae called by frame at 0x8dffffb0 source language c. Arglist at 0x8dffff58, args: Locals at 0x8dffff58, Previous frame's sp is 0x8dffff60 Saved registers: eip at 0x8dffff5c (gdb) x/37x $esp 0x8dffff5c: 0x801063ae 0x80103089 0x00000001 0x8dffff74 0x8dffff6c: 0x8dffff8c 0x80104ba2 0x00000400 0x000003d9 0x8dffff7c: 0x000000c8 0x0000000a 0x01010101 0x01010101 0x8dffff8c: 0x8dffffac 0x80104813 0x8010ff20 0x01010101 0x8dffff9c: 0x00000000 0x00000000 0x00000000 0x00000000 0x8dffffac: 0x80106199 0x8dffffb4 0x00000000 0x00000000 0x8dffffbc: 0x00000000 0x8dffffd4 0x00000000 0x00000000 0x8dffffcc: 0x00000000 0x00000007 0x00000000 0x00000000 0x8dffffdc: 0x0000002b 0x0000002b 0x00000040 0x00000000 0x8dffffec: 0x00000013 (gdb)
正直さっぱりですが、その25に載せた図2−2に当てはめるといいのかな。
その27から状況証拠(笑)的には0x00000007はSYS_execを表してるんだろうなと思います。
2. について
簡単にするためにシステムに依存しないシステムコールとして階乗を計算するシステムコールを追加してみました。
無意味ですね〜。
それと10の階乗を求めるテストプログラムも追加してます。
xv6-rev6とのdiffはこんな感じ。
diff --git a/Makefile b/Makefile index ffb085f..2b93723 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,7 @@ OBJS = \ uart.o\ vectors.o\ vm.o\ + factorial.o\ # Cross-compiling (e.g., on Mac OS X) #TOOLPREFIX = i386-jos-elf- @@ -72,8 +73,8 @@ AS = $(TOOLPREFIX)gas LD = $(TOOLPREFIX)ld OBJCOPY = $(TOOLPREFIX)objcopy OBJDUMP = $(TOOLPREFIX)objdump -#CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer +#CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -fno-omit-frame-pointer +CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -MD -ggdb -m32 -fno-omit-frame-pointer CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) ASFLAGS = -m32 -gdwarf-2 -Wa,-divide # FreeBSD ld wants ``elf_i386_fbsd'' @@ -146,7 +147,7 @@ _forktest: forktest.o $(ULIB) $(OBJDUMP) -S _forktest > forktest.asm mkfs: mkfs.c fs.h - gcc -m32 -Werror -Wall -o mkfs mkfs.c + gcc -m32 -Wall -o mkfs mkfs.c UPROGS=\ _cat\ @@ -164,6 +165,7 @@ UPROGS=\ _usertests\ _wc\ _zombie\ + _factorialtest\ fs.img: mkfs README $(UPROGS) ./mkfs fs.img README $(UPROGS) diff --git a/defs.h b/defs.h index 921c7bf..02cf6be 100644 --- a/defs.h +++ b/defs.h @@ -178,5 +178,8 @@ void switchkvm(void); int copyout(pde_t*, uint, void*, uint); void clearpteu(pde_t *pgdir, char *uva); +// factorial.c +int factorial(int); + // number of elements in fixed-size array #define NELEM(x) (sizeof(x)/sizeof((x)[0])) diff --git a/factorial.c b/factorial.c new file mode 100644 index 0000000..ae4e1cb --- /dev/null +++ b/factorial.c @@ -0,0 +1,25 @@ +#include "types.h" +#include "defs.h" +#include "param.h" +#include "stat.h" +#include "mmu.h" +#include "proc.h" + +int +sys_factorial(void) +{ + int start; + if(argint(0, &start) < 0) + return -1; + return factorial(start); +} + +int +factorial(int start) +{ + int ret; + + for(ret = 1; start > 1; start--) + ret *= start; + return ret; +} diff --git a/factorialtest.c b/factorialtest.c new file mode 100644 index 0000000..3a932ee --- /dev/null +++ b/factorialtest.c @@ -0,0 +1,14 @@ +#include "types.h" +#include "stat.h" +#include "user.h" + +int +main(int argc, char *argv[]) +{ + int fac, base; + + base = 10; + fac = factorial(base); + printf(1, "factrial %d is %d\n", base, fac); + exit(); +} diff --git a/syscall.c b/syscall.c index 0918da7..84be706 100644 --- a/syscall.c +++ b/syscall.c @@ -98,6 +98,7 @@ extern int sys_unlink(void); extern int sys_wait(void); extern int sys_write(void); extern int sys_uptime(void); +extern int sys_factorial(void); static int (*syscalls[])(void) = { [SYS_fork] sys_fork, @@ -121,6 +122,7 @@ static int (*syscalls[])(void) = { [SYS_link] sys_link, [SYS_mkdir] sys_mkdir, [SYS_close] sys_close, +[SYS_factorial] sys_factorial, }; void diff --git a/syscall.h b/syscall.h index 59a4576..1fb75d7 100644 --- a/syscall.h +++ b/syscall.h @@ -21,3 +21,5 @@ #define SYS_link 19 #define SYS_mkdir 20 #define SYS_close 21 + +#define SYS_factorial 22 diff --git a/usys.S b/usys.S index 8bfd8a1..62baf0c 100644 --- a/usys.S +++ b/usys.S @@ -29,3 +29,4 @@ SYSCALL(getpid) SYSCALL(sbrk) SYSCALL(sleep) SYSCALL(uptime) +SYSCALL(factorial)
3. について
力尽きました…
いやまぁ構造はディスクドライバとほぼ同じになるはずですが、ちゃんと動くものを作るのは(それを確認するためのコードも含めて)かなり大変そうです。
最近のコメント
名前
しゅごい
Jane Doe
FYI Avoid Annoying Unexpe…
Jane Doe
ご存じとは思いますが、whileには、”~の間”と…
peta_okechan
針金みたいなパーツを引っ張ると外れます。 他の方の…
虎徹ファン交換
虎徹の標準ファンを外す際に、どのようにして外されま…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…