]> Devi Nivas Git - cs3210-lab0.git/commitdiff
uptime() sys call for benchmarking
authorRobert Morris <rtm@nephron.lcs.mit.edu>
Wed, 11 Aug 2010 18:34:45 +0000 (14:34 -0400)
committerRobert Morris <rtm@nephron.lcs.mit.edu>
Wed, 11 Aug 2010 18:34:45 +0000 (14:34 -0400)
increase PHYSTOP

defs.h
kalloc.c
syscall.c
syscall.h
sysproc.c
trap.c
usertests.c
usys.S
vm.c

diff --git a/defs.h b/defs.h
index a051522a84ff0ec5b410f48b8a0c2ed63bbe297d..0197e700a858005104fce77e317a8018ef871b17 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -142,7 +142,7 @@ void            timerinit(void);
 
 // trap.c
 void            idtinit(void);
-extern int      ticks;
+extern uint     ticks;
 void            tvinit(void);
 extern struct spinlock tickslock;
 
index 7695006676f9e13153df50563818118435c4ddbb..ca87018f17b572d529affcdb0ffcb2823eeda508 100644 (file)
--- a/kalloc.c
+++ b/kalloc.c
@@ -23,14 +23,10 @@ struct {
 int nfreemem;
 
 // Initialize free list of physical pages.
-// This code cheats by just considering one megabyte of
-// pages after end.  Real systems would determine the
-// amount of memory available in the system and use it all.
 void
 kinit(char *p, uint len)
 {
   initlock(&kmem.lock, "kmem");
-  cprintf("end 0x%x free = %d(0x%x)\n", p, len);
   nfreemem = 0;
   kfree(p, len);
 }
index ce79dbdb7cb77ee2e6a3042f112aa305ec2d90a9..9296cffd5cd0e1fa5a394c71ce7bb33951d36a40 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -100,6 +100,7 @@ extern int sys_sleep(void);
 extern int sys_unlink(void);
 extern int sys_wait(void);
 extern int sys_write(void);
+extern int sys_uptime(void);
 
 static int (*syscalls[])(void) = {
 [SYS_chdir]   sys_chdir,
@@ -122,6 +123,7 @@ static int (*syscalls[])(void) = {
 [SYS_unlink]  sys_unlink,
 [SYS_wait]    sys_wait,
 [SYS_write]   sys_write,
+[SYS_uptime]  sys_uptime,
 };
 
 void
index f4b7807ed615bf10c8f6c4df8d044c6655ddf1bd..3a0fbcad930f1e6725b1fca000395310794c6489 100644 (file)
--- a/syscall.h
+++ b/syscall.h
@@ -19,3 +19,4 @@
 #define SYS_getpid 18
 #define SYS_sbrk   19
 #define SYS_sleep  20
+#define SYS_uptime 21
index 11770ffac3a076797fa8d16bc54ba8c803854031..efaa372d846860abf32d56462c8b4f67f6f8e385 100644 (file)
--- a/sysproc.c
+++ b/sysproc.c
@@ -57,7 +57,8 @@ sys_sbrk(void)
 int
 sys_sleep(void)
 {
-  int n, ticks0;
+  int n;
+  uint ticks0;
   
   if(argint(0, &n) < 0)
     return -1;
@@ -73,3 +74,16 @@ sys_sleep(void)
   release(&tickslock);
   return 0;
 }
+
+// return how many clock tick interrupts have occurred
+// since boot.
+int
+sys_uptime(void)
+{
+  uint xticks;
+  
+  acquire(&tickslock);
+  xticks = ticks;
+  release(&tickslock);
+  return xticks;
+}
diff --git a/trap.c b/trap.c
index 1f35708e706f4551d6a119bbf729ca486bb8a0ba..daee22f6e842a359287a84162b40088747654e9d 100644 (file)
--- a/trap.c
+++ b/trap.c
@@ -11,7 +11,7 @@
 struct gatedesc idt[256];
 extern uint vectors[];  // in vectors.S: array of 256 entry pointers
 struct spinlock tickslock;
-int ticks;
+uint ticks;
 
 void
 tvinit(void)
index 9ad6448f7786715400e2fdc784655efa9021be90..670a4a8e3d691464783607a66027d0aa5e4cd0ca 100644 (file)
@@ -322,8 +322,9 @@ void
 mem(void)
 {
   void *m1, *m2;
-  int pid;
+  int pid, ppid;
 
+  ppid = getpid();
   if((pid = fork()) == 0){
     m1 = 0;
     while((m2 = malloc(10001)) != 0) {
@@ -338,6 +339,7 @@ mem(void)
     m1 = malloc(1024*20);
     if(m1 == 0) {
       printf(1, "couldn't allocate mem?!!\n");
+      kill(ppid);
       exit();
     }
     free(m1);
@@ -1233,6 +1235,7 @@ void
 sbrktest(void)
 {
   int pid;
+  char *oldbrk = sbrk(0);
 
   printf(stdout, "sbrk test\n");
 
@@ -1313,6 +1316,25 @@ sbrktest(void)
     exit();
   }
 
+  // can we read the kernel's memory?
+  for(a = (char*)(640*1024); a < (char *)2000000; a += 50000){
+    int ppid = getpid();
+    int pid = fork();
+    if(pid < 0){
+      printf(stdout, "fork failed\n");
+      exit();
+    }
+    if(pid == 0){
+      printf(stdout, "oops could read %x = %x\n", a, *a);
+      kill(ppid);
+      exit();
+    }
+    wait();
+  }
+
+  if(sbrk(0) > oldbrk)
+    sbrk(-(sbrk(0) - oldbrk));
+
   printf(stdout, "sbrk test OK\n");
 }
 
diff --git a/usys.S b/usys.S
index 2291b02d4112a03c2b8818fcc13ba955f3b368d3..8bfd8a1bc4ab9ebbee520f683a30b051f9af5a45 100644 (file)
--- a/usys.S
+++ b/usys.S
@@ -28,3 +28,4 @@ SYSCALL(dup)
 SYSCALL(getpid)
 SYSCALL(sbrk)
 SYSCALL(sleep)
+SYSCALL(uptime)
diff --git a/vm.c b/vm.c
index 8755b82be0e57f182b2909417f41d3dea053870f..98ac10826f10b41bd53ca23cda6574922423ed02 100644 (file)
--- a/vm.c
+++ b/vm.c
@@ -29,7 +29,7 @@
 // (both in physical memory and in the kernel's virtual address
 // space).
 
-#define PHYSTOP  0x300000
+#define PHYSTOP  0x1000000
 #define USERTOP  0xA0000
 
 static uint kerntext;  // Linker starts kernel at 1MB
@@ -336,6 +336,8 @@ copyuvm(pde_t *pgdir, uint sz)
 
 // Gather information about physical memory layout.
 // Called once during boot.
+// Really should find out how much physical memory
+// there is rather than assuming PHYSTOP.
 void
 pminit(void)
 {