{"id":1408,"date":"2012-03-08T21:38:29","date_gmt":"2012-03-08T03:38:29","guid":{"rendered":"http:\/\/peta.okechan.net\/blog\/?p=1408"},"modified":"2012-03-14T11:21:46","modified_gmt":"2012-03-14T02:21:46","slug":"xv6%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%89%e3%83%aa%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0-%e3%81%9d%e3%81%ae32","status":"publish","type":"post","link":"https:\/\/peta.okechan.net\/blog\/archives\/1408","title":{"rendered":"[xv6 #32] Chapter 2 &#8211; Traps, interrupts, and drivers &#8211; Exercises"},"content":{"rendered":"<p>\u30c6\u30ad\u30b9\u30c8\u306e42\u30da\u30fc\u30b8<\/p>\n<h3>\u672c\u6587<\/h3>\n<p>1. \u6700\u521d\u306e\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u30ad\u30e3\u30c3\u30c1\u3059\u308b\u305f\u3081\u306b\u3001syscall()\u306e\u6700\u521d\u306e\u547d\u4ee4\u306b\u30d6\u30ec\u30fc\u30af\u30dd\u30a4\u30f3\u30c8\u3092\u30bb\u30c3\u30c8\u3057\u306a\u3055\u3044\u3002<br \/>\n\uff08\u4f8b\u3048\u3070\u3001GDB\u306ebr syscall\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u3063\u3066\uff09<br \/>\n\u3053\u306e\u6642\u70b9\u306e\u30b9\u30bf\u30c3\u30af\u4e0a\u306e\u5024\u306f\u4f55\u304b\uff1f<br \/>\n\u3053\u306e\u30d6\u30ec\u30fc\u30af\u30dd\u30a4\u30f3\u30c8\u306b\u304a\u3051\u308bx\/37x $esp\u306e\u51fa\u529b\u3092\u3001\u4f55\u306e\u305f\u3081\u306e\u3082\u306e\u304b\u30e9\u30d9\u30eb\u4ed8\u3051\u3057\u3066\u8aac\u660e\u3057\u306a\u3055\u3044\u3002<br \/>\n\uff08\u4f8b\u3048\u3070\u3001%ebp\u306ftrap, trapframe.eip, \u4f5c\u696d\u7528\u30b9\u30da\u30fc\u30b9\u7b49\uff09<\/p>\n<p>2. \u65b0\u305f\u306b\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u8ffd\u52a0\u3057\u306a\u3055\u3044\u3002<\/p>\n<p>3. \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30c9\u30e9\u30a4\u30d0\u3092\u8ffd\u52a0\u3057\u306a\u3055\u3044\u3002<\/p>\n<h3>\u4f5c\u696d<\/h3>\n<p>1. \u306b\u3064\u3044\u3066<br \/>\n\u30b3\u30f3\u30d1\u30a4\u30eb\u301cGDB\u306b\u3088\u308b\u8ffd\u8de1\u306e\u65b9\u6cd5\u306b\u3064\u3044\u3066\u306f<a href=\"https:\/\/peta.okechan.net\/blog\/archives\/1210\" title=\"xv6\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 \u305d\u306e0\">\u305d\u306e0<\/a>\u3068<a href=\"https:\/\/peta.okechan.net\/blog\/archives\/1339\" title=\"xv6\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 \u305d\u306e20\">\u305d\u306e20<\/a>\u3092\u53c2\u7167\u3002<\/p>\n<p>GDB\u3067x\/37x $esp\u3092\u3084\u3063\u305f\u6642\u70b9\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u306f\u3053\u3093\u306a\u611f\u3058\u3067\u3059\u3002<br \/>\n<a href=\"https:\/\/peta.okechan.net\/blog\/wp-content\/uploads\/2012\/03\/xv6part32.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/peta.okechan.net\/blog\/wp-content\/uploads\/2012\/03\/xv6part32-300x168.png\" alt=\"\" title=\"xv6part32\" width=\"300\" height=\"168\" class=\"aligncenter size-medium wp-image-1409\" srcset=\"https:\/\/peta.okechan.net\/blog\/wp-content\/uploads\/2012\/03\/xv6part32-300x168.png 300w, https:\/\/peta.okechan.net\/blog\/wp-content\/uploads\/2012\/03\/xv6part32-1024x575.png 1024w, https:\/\/peta.okechan.net\/blog\/wp-content\/uploads\/2012\/03\/xv6part32.png 1366w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>GDB\u306e\u51fa\u529b\u306e\u91cd\u8981\u306a\u90e8\u5206\u3092\u30c6\u30ad\u30b9\u30c8\u3067\u629c\u304d\u51fa\u3059\u3068\u3001<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">(gdb) info frame\nStack level 0, frame at 0x8dffff60:\n eip = 0x8010516f in syscall (syscall.c:128); saved eip 0x801063ae\n called by frame at 0x8dffffb0\n source language c.\n Arglist at 0x8dffff58, args: \n Locals at 0x8dffff58, Previous frame's sp is 0x8dffff60\n Saved registers:\n  eip at 0x8dffff5c\n(gdb) x\/37x $esp\n0x8dffff5c:\t0x801063ae\t0x80103089\t0x00000001\t0x8dffff74\n0x8dffff6c:\t0x8dffff8c\t0x80104ba2\t0x00000400\t0x000003d9\n0x8dffff7c:\t0x000000c8\t0x0000000a\t0x01010101\t0x01010101\n0x8dffff8c:\t0x8dffffac\t0x80104813\t0x8010ff20\t0x01010101\n0x8dffff9c:\t0x00000000\t0x00000000\t0x00000000\t0x00000000\n0x8dffffac:\t0x80106199\t0x8dffffb4\t0x00000000\t0x00000000\n0x8dffffbc:\t0x00000000\t0x8dffffd4\t0x00000000\t0x00000000\n0x8dffffcc:\t0x00000000\t0x00000007\t0x00000000\t0x00000000\n0x8dffffdc:\t0x0000002b\t0x0000002b\t0x00000040\t0x00000000\n0x8dffffec:\t0x00000013\n(gdb) <\/pre>\n<p>\u6b63\u76f4\u3055\u3063\u3071\u308a\u3067\u3059\u304c\u3001<a href=\"https:\/\/peta.okechan.net\/blog\/archives\/1383\" title=\"xv6\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 \u305d\u306e25\">\u305d\u306e25<\/a>\u306b\u8f09\u305b\u305f\u56f32\u22122\u306b\u5f53\u3066\u306f\u3081\u308b\u3068\u3044\u3044\u306e\u304b\u306a\u3002<br \/>\n<a href=\"https:\/\/peta.okechan.net\/blog\/archives\/1394\" title=\"xv6\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 \u305d\u306e27\">\u305d\u306e27<\/a>\u304b\u3089\u72b6\u6cc1\u8a3c\u62e0\uff08\u7b11\uff09\u7684\u306b\u306f0x00000007\u306fSYS_exec\u3092\u8868\u3057\u3066\u308b\u3093\u3060\u308d\u3046\u306a\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>2. \u306b\u3064\u3044\u3066<br \/>\n\u7c21\u5358\u306b\u3059\u308b\u305f\u3081\u306b\u30b7\u30b9\u30c6\u30e0\u306b\u4f9d\u5b58\u3057\u306a\u3044\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3068\u3057\u3066\u968e\u4e57\u3092\u8a08\u7b97\u3059\u308b\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u8ffd\u52a0\u3057\u3066\u307f\u307e\u3057\u305f\u3002<br \/>\n\u7121\u610f\u5473\u3067\u3059\u306d\u301c\u3002<br \/>\n\u305d\u308c\u306810\u306e\u968e\u4e57\u3092\u6c42\u3081\u308b\u30c6\u30b9\u30c8\u30d7\u30ed\u30b0\u30e9\u30e0\u3082\u8ffd\u52a0\u3057\u3066\u307e\u3059\u3002<\/p>\n<p>xv6-rev6\u3068\u306ediff\u306f\u3053\u3093\u306a\u611f\u3058\u3002<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">diff --git a\/Makefile b\/Makefile\nindex ffb085f..2b93723 100644\n--- a\/Makefile\n+++ b\/Makefile\n@@ -27,6 +27,7 @@ OBJS = \\\n \tuart.o\\\n \tvectors.o\\\n \tvm.o\\\n+\tfactorial.o\\\n \n # Cross-compiling (e.g., on Mac OS X)\n #TOOLPREFIX = i386-jos-elf-\n@@ -72,8 +73,8 @@ AS = $(TOOLPREFIX)gas\n LD = $(TOOLPREFIX)ld\n OBJCOPY = $(TOOLPREFIX)objcopy\n OBJDUMP = $(TOOLPREFIX)objdump\n-#CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer\n-CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer\n+#CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -fno-omit-frame-pointer\n+CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -MD -ggdb -m32 -fno-omit-frame-pointer\n CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c \/dev\/null &gt;\/dev\/null 2&gt;&amp;1 &amp;&amp; echo -fno-stack-protector)\n ASFLAGS = -m32 -gdwarf-2 -Wa,-divide\n # FreeBSD ld wants ``elf_i386_fbsd&#039;&#039;\n@@ -146,7 +147,7 @@ _forktest: forktest.o $(ULIB)\n \t$(OBJDUMP) -S _forktest &gt; forktest.asm\n \n mkfs: mkfs.c fs.h\n-\tgcc -m32 -Werror -Wall -o mkfs mkfs.c\n+\tgcc -m32 -Wall -o mkfs mkfs.c\n \n UPROGS=\\\n \t_cat\\\n@@ -164,6 +165,7 @@ UPROGS=\\\n \t_usertests\\\n \t_wc\\\n \t_zombie\\\n+\t_factorialtest\\\n \n fs.img: mkfs README $(UPROGS)\n \t.\/mkfs fs.img README $(UPROGS)\ndiff --git a\/defs.h b\/defs.h\nindex 921c7bf..02cf6be 100644\n--- a\/defs.h\n+++ b\/defs.h\n@@ -178,5 +178,8 @@ void            switchkvm(void);\n int             copyout(pde_t*, uint, void*, uint);\n void            clearpteu(pde_t *pgdir, char *uva);\n \n+\/\/ factorial.c\n+int\t\tfactorial(int);\n+\n \/\/ number of elements in fixed-size array\n #define NELEM(x) (sizeof(x)\/sizeof((x)&#x5B;0]))\ndiff --git a\/factorial.c b\/factorial.c\nnew file mode 100644\nindex 0000000..ae4e1cb\n--- \/dev\/null\n+++ b\/factorial.c\n@@ -0,0 +1,25 @@\n+#include &quot;types.h&quot;\n+#include &quot;defs.h&quot;\n+#include &quot;param.h&quot;\n+#include &quot;stat.h&quot;\n+#include &quot;mmu.h&quot;\n+#include &quot;proc.h&quot;\n+\n+int\n+sys_factorial(void)\n+{\n+\tint start;\n+\tif(argint(0, &amp;start) &lt; 0)\n+\t\treturn -1;\n+\treturn factorial(start);\n+}\n+\n+int\n+factorial(int start)\n+{\n+\tint ret;\n+\n+\tfor(ret = 1; start &gt; 1; start--)\n+\t\tret *= start;\n+\treturn ret;\n+}\ndiff --git a\/factorialtest.c b\/factorialtest.c\nnew file mode 100644\nindex 0000000..3a932ee\n--- \/dev\/null\n+++ b\/factorialtest.c\n@@ -0,0 +1,14 @@\n+#include &quot;types.h&quot;\n+#include &quot;stat.h&quot;\n+#include &quot;user.h&quot;\n+\n+int\n+main(int argc, char *argv&#x5B;])\n+{\n+  int fac, base;\n+  \n+  base = 10;\n+  fac = factorial(base);\n+  printf(1, &quot;factrial %d is %d\\n&quot;, base, fac);\n+  exit();\n+}\ndiff --git a\/syscall.c b\/syscall.c\nindex 0918da7..84be706 100644\n--- a\/syscall.c\n+++ b\/syscall.c\n@@ -98,6 +98,7 @@ extern int sys_unlink(void);\n extern int sys_wait(void);\n extern int sys_write(void);\n extern int sys_uptime(void);\n+extern int sys_factorial(void);\n \n static int (*syscalls&#x5B;])(void) = {\n &#x5B;SYS_fork]    sys_fork,\n@@ -121,6 +122,7 @@ static int (*syscalls&#x5B;])(void) = {\n &#x5B;SYS_link]    sys_link,\n &#x5B;SYS_mkdir]   sys_mkdir,\n &#x5B;SYS_close]   sys_close,\n+&#x5B;SYS_factorial] sys_factorial,\n };\n \n void\ndiff --git a\/syscall.h b\/syscall.h\nindex 59a4576..1fb75d7 100644\n--- a\/syscall.h\n+++ b\/syscall.h\n@@ -21,3 +21,5 @@\n #define SYS_link   19\n #define SYS_mkdir  20\n #define SYS_close  21\n+\n+#define SYS_factorial 22\ndiff --git a\/usys.S b\/usys.S\nindex 8bfd8a1..62baf0c 100644\n--- a\/usys.S\n+++ b\/usys.S\n@@ -29,3 +29,4 @@ SYSCALL(getpid)\n SYSCALL(sbrk)\n SYSCALL(sleep)\n SYSCALL(uptime)\n+SYSCALL(factorial)\n<\/pre>\n<p>3. \u306b\u3064\u3044\u3066<br \/>\n\u529b\u5c3d\u304d\u307e\u3057\u305f\u2026<br \/>\n\u3044\u3084\u307e\u3041\u69cb\u9020\u306f\u30c7\u30a3\u30b9\u30af\u30c9\u30e9\u30a4\u30d0\u3068\u307b\u307c\u540c\u3058\u306b\u306a\u308b\u306f\u305a\u3067\u3059\u304c\u3001\u3061\u3083\u3093\u3068\u52d5\u304f\u3082\u306e\u3092\u4f5c\u308b\u306e\u306f\uff08\u305d\u308c\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306e\u30b3\u30fc\u30c9\u3082\u542b\u3081\u3066\uff09\u304b\u306a\u308a\u5927\u5909\u305d\u3046\u3067\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u30c6\u30ad\u30b9\u30c8\u306e42\u30da\u30fc\u30b8<\/p>\n<h3>\u672c\u6587<\/h3>\n<p>1. \u6700\u521d\u306e\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u30ad\u30e3\u30c3\u30c1\u3059\u308b\u305f\u3081\u306b\u3001syscall()\u306e\u6700\u521d\u306e\u547d\u4ee4\u306b\u30d6\u30ec\u30fc\u30af\u30dd\u30a4\u30f3\u30c8\u3092\u30bb\u30c3\u30c8\u3057\u306a\u3055\u3044\u3002<br \/>\n\uff08\u4f8b\u3048\u3070\u3001GDB\u306ebr syscall\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u3063\u3066\uff09<br \/>\n\u3053\u306e\u6642\u70b9\u306e\u30b9\u30bf\u30c3\u30af\u4e0a\u306e\u5024\u306f\u4f55\u304b\uff1f<br \/>\n\u3053\u306e\u30d6\u30ec\u30fc\u30af\u30dd\u30a4\u30f3\u30c8\u306b\u304a\u3051\u308bx\/37x $esp\u306e\u51fa\u529b\u3092\u3001\u4f55\u306e\u305f\u3081\u306e\u3082\u306e\u304b\u30e9\u30d9\u30eb\u4ed8\u3051\u3057\u3066\u8aac\u660e\u3057\u306a\u3055\u3044\u3002<br \/>\n\uff08\u4f8b\u3048\u3070\u3001%ebp\u306ftrap, trapframe.eip, \u4f5c\u696d\u7528\u30b9\u30da\u30fc\u30b9\u7b49\uff09<\/p>\n<p>2. \u65b0\u305f\u306b\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u8ffd\u52a0\u3057\u306a\u3055\u3044\u3002<\/p>\n<p>3. \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30c9\u30e9\u30a4\u30d0\u3092\u8ffd\u52a0\u3057\u306a\u3055\u3044\u3002<\/p>\n<h3>\u4f5c\u696d<\/h3>\n<p>1. \u306b\u3064\u3044\u3066<br \/>\n\u30b3\u30f3\u30d1\u30a4\u30eb\u301cGDB\u306b\u3088\u308b\u8ffd\u8de1\u306e\u65b9\u6cd5\u306b\u3064\u3044\u3066\u306f<a href=\"https:\/\/peta.okechan.net\/blog\/archives\/1210\" title=\"xv6\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 \u305d\u306e0\">\u305d\u306e0<\/a>\u3068<a href=\"https:\/\/peta.okechan.net\/blog\/archives\/1339\" title=\"xv6\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 \u305d\u306e20\">\u305d\u306e20<\/a>\u3092\u53c2\u7167\u3002<\/p>\n<p>GDB\u3067x\/37x $esp\u3092\u3084\u3063\u305f\u6642\u70b9\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u306f\u3053\u3093\u306a\u611f\u3058\u3067\u3059\u3002<br \/>\n<a href=\"https:\/\/peta.okechan.net\/blog\/wp-content\/uploads\/2012\/03\/xv6part32.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/peta.okechan.net\/blog\/wp-content\/uploads\/2012\/03\/xv6part32-300x168.png\" alt=\"\" title=\"xv6part32\" width=\"300\" height=\"168\" class=\"aligncenter size-medium wp-image-1409\" srcset=\"https:\/\/peta.okechan.net\/blog\/wp-content\/uploads\/2012\/03\/xv6part32-300x168.png 300w, https:\/\/peta.okechan.net\/blog\/wp-content\/uploads\/2012\/03\/xv6part32-1024x575.png 1024w, https:\/\/peta.okechan.net\/blog\/wp-content\/uploads\/2012\/03\/xv6part32.png 1366w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>GDB\u306e\u51fa\u529b\u306e\u91cd\u8981\u306a\u90e8\u5206\u3092\u30c6\u30ad\u30b9\u30c8\u3067\u629c\u304d\u51fa\u3059\u3068\u3001<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">(gdb) info frame\nStack level 0, frame at 0x8dffff60:\n eip = 0x8010516f in syscall (syscall.c:128); saved eip 0x801063ae\n called by frame at 0x8dffffb0\n source language c.\n Arglist at 0x8dffff58, args: \n Locals at 0x8dffff58, Previous frame's sp is 0x8dffff60\n Saved registers:\n  eip at 0x8dffff5c\n(gdb) x\/37x $esp\n0x8dffff5c:\t0x801063ae\t0x80103089\t0x00000001\t0x8dffff74\n0x8dffff6c:\t0x8dffff8c\t0x80104ba2\t0x00000400\t0x000003d9\n0x8dffff7c:\t0x000000c8\t0x0000000a\t0x01010101\t0x01010101\n0x8dffff8c:\t0x8dffffac\t0x80104813\t0x8010ff20\t0x01010101\n0x8dffff9c:\t0x00000000\t0x00000000\t0x00000000\t0x00000000\n0x8dffffac:\t0x80106199\t0x8dffffb4\t0x00000000\t0x00000000\n0x8dffffbc:\t0x00000000\t0x8dffffd4\t0x00000000\t0x00000000\n0x8dffffcc:\t0x00000000\t0x00000007\t0x00000000\t0x00000000\n0x8dffffdc:\t0x0000002b\t0x0000002b\t0x00000040\t0x00000000\n0x8dffffec:\t0x00000013\n(gdb) <\/pre>\n<p>\u6b63\u76f4\u3055\u3063\u3071\u308a\u3067\u3059\u304c\u3001<a href=\"https:\/\/peta.okechan.net\/blog\/archives\/1383\" title=\"xv6\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 \u305d\u306e25\">\u305d\u306e25<\/a>\u306b\u8f09\u305b\u305f\u56f32\u22122\u306b\u5f53\u3066\u306f\u3081\u308b\u3068\u3044\u3044\u306e\u304b\u306a\u3002<br \/>\n<a href=\"https:\/\/peta.okechan.net\/blog\/archives\/1394\" title=\"xv6\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 \u305d\u306e27\">\u305d\u306e27<\/a>\u304b\u3089\u72b6\u6cc1\u8a3c\u62e0\uff08\u7b11\uff09\u7684\u306b\u306f0x00000007\u306fSYS_exec\u3092\u8868\u3057\u3066\u308b\u3093\u3060\u308d\u3046\u306a\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>2. \u306b\u3064\u3044\u3066<br \/>\n\u7c21\u5358\u306b\u3059\u308b\u305f\u3081\u306b\u30b7\u30b9\u30c6\u30e0\u306b\u4f9d\u5b58\u3057\u306a\u3044\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3068\u3057\u3066\u968e\u4e57\u3092\u8a08\u7b97\u3059\u308b\u30b7\u30b9\u30c6\u30e0\u30b3\u30fc\u30eb\u3092\u8ffd\u52a0\u3057\u3066\u307f\u307e\u3057\u305f\u3002<br \/>\n\u7121\u610f\u5473\u3067\u3059\u306d\u301c\u3002<br \/>\n\u305d\u308c\u306810\u306e\u968e\u4e57\u3092\u6c42\u3081\u308b\u30c6\u30b9\u30c8\u30d7\u30ed\u30b0\u30e9\u30e0\u3082\u8ffd\u52a0\u3057\u3066\u307e\u3059\u3002<\/p>\n<p>xv6-rev6\u3068\u306ediff\u306f\u3053\u3093\u306a\u611f\u3058\u3002<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">diff --git a\/Makefile b\/Makefile\nindex ffb085f..2b93723 100644\n--- a\/Makefile\n+++ b\/Makefile\n@@ -27,6 +27,7 @@ OBJS = \\\n \tuart.o\\\n \tvectors.o\\\n \tvm.o\\\n+\tfactorial.o\\\n \n # Cross-compiling (e.g., on Mac OS X)\n #TOOLPREFIX = i386-jos-elf-\n@@ -72,8 +73,8 @@ AS = $(TOOLPREFIX)gas\n LD = $(TOOLPREFIX)ld\n OBJCOPY = $(TOOLPREFIX)objcopy\n OBJDUMP = $(TOOLPREFIX)objdump\n-#CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer\n-CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer\n+#CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -fno-omit-frame-pointer\n+CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -MD -ggdb -m32 -fno-omit-frame-pointer\n CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c \/dev\/null &gt;\/dev\/null 2&gt;&amp;1 &amp;&amp; echo -fno-stack-protector)\n ASFLAGS = -m32 -gdwarf-2 -Wa,-divide\n # FreeBSD ld wants ``elf_i386_fbsd&#039;&#039;\n@@ -146,7 +147,7 @@ _forktest: forktest.o $(ULIB)\n \t$(OBJDUMP) -S _forktest &gt; forktest.asm\n \n mkfs: mkfs.c fs.h\n-\tgcc -m32 -Werror -Wall -o mkfs mkfs.c\n+\tgcc -m32 -Wall -o mkfs mkfs.c\n \n UPROGS=\\\n \t_cat\\\n@@ -164,6 +165,7 @@ UPROGS=\\\n \t_usertests\\\n \t_wc\\\n \t_zombie\\\n+\t_factorialtest\\\n \n fs.img: mkfs README $(UPROGS)\n \t.\/mkfs fs.img README $(UPROGS)\ndiff --git a\/defs.h b\/defs.h\nindex 921c7bf..02cf6be 100644\n--- a\/defs.h\n+++ b\/defs.h\n@@ -178,5 +178,8 @@ void            switchkvm(void);\n int             copyout(pde_t*, uint, void*, uint);\n void            clearpteu(pde_t *pgdir, char *uva);\n \n+\/\/ factorial.c\n+int\t\tfactorial(int);\n+\n \/\/ number of elements in fixed-size array\n #define NELEM(x) (sizeof(x)\/sizeof((x)&#x5B;0]))\ndiff --git a\/factorial.c b\/factorial.c\nnew file mode 100644\nindex 0000000..ae4e1cb\n--- \/dev\/null\n+++ b\/factorial.c\n@@ -0,0 +1,25 @@\n+#include &quot;types.h&quot;\n+#include &quot;defs.h&quot;\n+#include &quot;param.h&quot;\n+#include &quot;stat.h&quot;\n+#include &quot;mmu.h&quot;\n+#include &quot;proc.h&quot;\n+\n+int\n+sys_factorial(void)\n+{\n+\tint start;\n+\tif(argint(0, &amp;start) &lt; 0)\n+\t\treturn -1;\n+\treturn factorial(start);\n+}\n+\n+int\n+factorial(int start)\n+{\n+\tint ret;\n+\n+\tfor(ret = 1; start &gt; 1; start--)\n+\t\tret *= start;\n+\treturn ret;\n+}\ndiff --git a\/factorialtest.c b\/factorialtest.c\nnew file mode 100644\nindex 0000000..3a932ee\n--- \/dev\/null\n+++ b\/factorialtest.c\n@@ -0,0 +1,14 @@\n+#include &quot;types.h&quot;\n+#include &quot;stat.h&quot;\n+#include &quot;user.h&quot;\n+\n+int\n+main(int argc, char *argv&#x5B;])\n+{\n+  int fac, base;\n+  \n+  base = 10;\n+  fac = factorial(base);\n+  printf(1, &quot;factrial %d is %d\\n&quot;, base, fac);\n+  exit();\n+}\ndiff --git a\/syscall.c b\/syscall.c\nindex 0918da7..84be706 100644\n--- a\/syscall.c\n+++ b\/syscall.c\n@@ -98,6 +98,7 @@ extern int sys_unlink(void);\n extern int sys_wait(void);\n extern int sys_write(void);\n extern int sys_uptime(void);\n+extern int sys_factorial(void);\n \n static int (*syscalls&#x5B;])(void) = {\n &#x5B;SYS_fork]    sys_fork,\n@@ -121,6 +122,7 @@ static int (*syscalls&#x5B;])(void) = {\n &#x5B;SYS_link]    sys_link,\n &#x5B;SYS_mkdir]   sys_mkdir,\n &#x5B;SYS_close]   sys_close,\n+&#x5B;SYS_factorial] sys_factorial,\n };\n \n void\ndiff --git a\/syscall.h b\/syscall.h\nindex 59a4576..1fb75d7 100644\n--- a\/syscall.h\n+++ b\/syscall.h\n@@ -21,3 +21,5 @@\n #define SYS_link   19\n #define SYS_mkdir  20\n #define SYS_close  21\n+\n+#define SYS_factorial 22\ndiff --git a\/usys.S b\/usys.S\nindex 8bfd8a1..62baf0c 100644\n--- a\/usys.S\n+++ b\/usys.S\n@@ -29,3 +29,4 @@ SYSCALL(getpid)\n SYSCALL(sbrk)\n SYSCALL(sleep)\n SYSCALL(uptime)\n+SYSCALL(factorial)\n<\/pre>\n<p>3. \u306b\u3064\u3044\u3066<br \/>\n\u529b\u5c3d\u304d\u307e\u3057\u305f\u2026<br \/>\n\u3044\u3084\u307e\u3041\u69cb\u9020\u306f\u30c7\u30a3\u30b9\u30af\u30c9\u30e9\u30a4\u30d0\u3068\u307b\u307c\u540c\u3058\u306b\u306a\u308b\u306f\u305a\u3067\u3059\u304c\u3001\u3061\u3083\u3093\u3068\u52d5\u304f\u3082\u306e\u3092\u4f5c\u308b\u306e\u306f\uff08\u305d\u308c\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306e\u30b3\u30fc\u30c9\u3082\u542b\u3081\u3066\uff09\u304b\u306a\u308a\u5927\u5909\u305d\u3046\u3067\u3059\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32],"tags":[405],"class_list":["post-1408","post","type-post","status-publish","format-standard","hentry","category-tech","tag-xv6"],"_links":{"self":[{"href":"https:\/\/peta.okechan.net\/blog\/wp-json\/wp\/v2\/posts\/1408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/peta.okechan.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/peta.okechan.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/peta.okechan.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/peta.okechan.net\/blog\/wp-json\/wp\/v2\/comments?post=1408"}],"version-history":[{"count":0,"href":"https:\/\/peta.okechan.net\/blog\/wp-json\/wp\/v2\/posts\/1408\/revisions"}],"wp:attachment":[{"href":"https:\/\/peta.okechan.net\/blog\/wp-json\/wp\/v2\/media?parent=1408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/peta.okechan.net\/blog\/wp-json\/wp\/v2\/categories?post=1408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/peta.okechan.net\/blog\/wp-json\/wp\/v2\/tags?post=1408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}