]> Devi Nivas Git - cs3210-lab0.git/commitdiff
map kernel instructions r/o
authorRobert Morris <rtm@csail.mit.edu>
Mon, 20 Sep 2010 10:00:22 +0000 (06:00 -0400)
committerRobert Morris <rtm@csail.mit.edu>
Mon, 20 Sep 2010 10:00:22 +0000 (06:00 -0400)
usertests.c
vm.c

index e62703d52309e81db5dc8e44e0125595e665cab5..177ffbaddc9ab6aec84a44b17d93d5663ffdff32 100644 (file)
@@ -1419,6 +1419,7 @@ validatetest(void)
   printf(stdout, "validate ok\n");
 }
 
+// does unintialized data start out zero?
 char uninit[10000];
 void
 bsstest(void)
@@ -1434,6 +1435,32 @@ bsstest(void)
   printf(stdout, "bss test ok\n");
 }
 
+// does exec do something sensible if the arguments
+// are larger than a page?
+void
+bigargtest(void)
+{
+  int pid, ppid;
+
+  ppid = getpid();
+  pid = fork();
+  if(pid == 0){
+    char *args[100];
+    int i;
+    for(i = 0; i < 99; i++)
+      args[i] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+    args[99] = 0;
+    printf(stdout, "bigarg test\n");
+    exec("echo", args);
+    printf(stdout, "bigarg test ok\n");
+    exit();
+  } else if(pid < 0){
+    printf(stdout, "bigargtest: fork failed\n");
+    exit();
+  }
+  wait();
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -1445,6 +1472,7 @@ main(int argc, char *argv[])
   }
   close(open("usertests.ran", O_CREATE));
 
+  // bigargtest();
   bsstest();
   sbrktest();
   validatetest();
diff --git a/vm.c b/vm.c
index c57fa53d854bf1c8cb3e825f4edd366f8dfae657..cd6b255bc0ddd6ae0a2b86fa54e7be7acc787cda 100644 (file)
--- a/vm.c
+++ b/vm.c
@@ -125,6 +125,9 @@ pde_t*
 setupkvm(void)
 {
   pde_t *pgdir;
+  extern char etext[];
+  char *rwstart = PGROUNDDOWN(etext) - PGSIZE;
+  uint rwlen = (uint)rwstart - 0x100000;
 
   // Allocate page directory
   if(!(pgdir = (pde_t *) kalloc()))
@@ -132,8 +135,10 @@ setupkvm(void)
   memset(pgdir, 0, PGSIZE);
   if(// Map IO space from 640K to 1Mbyte
      !mappages(pgdir, (void *)USERTOP, 0x60000, USERTOP, PTE_W) ||
-     // Map kernel and free memory pool
-     !mappages(pgdir, (void *)0x100000, PHYSTOP-0x100000, 0x100000, PTE_W) ||
+     // Map kernel instructions
+     !mappages(pgdir, (void *)0x100000, rwlen, 0x100000, 0) ||
+     // Map kernel data and free memory pool
+     !mappages(pgdir, rwstart, PHYSTOP-(uint)rwstart, (uint)rwstart, PTE_W) ||
      // Map devices such as ioapic, lapic, ...
      !mappages(pgdir, (void *)0xFE000000, 0x2000000, 0xFE000000, PTE_W))
     return 0;