From abfe9999f447c15d904b3c11f32d4a22a45470a0 Mon Sep 17 00:00:00 2001 From: Robert Morris <rtm@csail.mit.edu> Date: Mon, 1 Jul 2019 17:46:06 -0400 Subject: have fork() fail, not panic, if not enough phys mem --- user/cow.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 user/cow.c (limited to 'user/cow.c') diff --git a/user/cow.c b/user/cow.c new file mode 100644 index 0000000..f770cc9 --- /dev/null +++ b/user/cow.c @@ -0,0 +1,54 @@ +// +// tests for copy-on-write fork() assignment. +// + +#include "kernel/types.h" +#include "kernel/memlayout.h" +#include "user/user.h" + +// allocate more than half of physical memory, +// then fork. this will fail in the default +// kernel, which does not support copy-on-write. +void +simpletest() +{ + uint64 phys_size = PHYSTOP - KERNBASE; + int sz = (phys_size / 3) * 2; + + printf(1, "simple: "); + + char *p = sbrk(sz); + if(p == (char*)0xffffffffffffffffL){ + printf(1, "sbrk(%d) failed\n", sz); + exit(); + } + + for(char *q = p; q < p + sz; q += 4096){ + *(int*)q = getpid(); + } + + int pid = fork(); + if(pid < 0){ + printf(1, "fork() failed\n"); + exit(); + } + + if(pid == 0) + exit(); + + wait(); + + if(sbrk(-sz) == (char*)0xffffffffffffffffL){ + printf(1, "sbrk(-%d) failed\n", sz); + exit(); + } + + printf(1, "simple ok\n"); +} + +int +main(int argc, char *argv[]) +{ + simpletest(); + exit(); +} -- cgit v1.2.3