uptime() sys call for benchmarking
increase PHYSTOP
This commit is contained in:
		
							parent
							
								
									83d2db91f7
								
							
						
					
					
						commit
						789b508d53
					
				
					 9 changed files with 47 additions and 9 deletions
				
			
		
							
								
								
									
										2
									
								
								defs.h
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								defs.h
									
										
									
									
									
								
							|  | @ -142,7 +142,7 @@ void            timerinit(void); | ||||||
| 
 | 
 | ||||||
| // trap.c
 | // trap.c
 | ||||||
| void            idtinit(void); | void            idtinit(void); | ||||||
| extern int      ticks; | extern uint     ticks; | ||||||
| void            tvinit(void); | void            tvinit(void); | ||||||
| extern struct spinlock tickslock; | extern struct spinlock tickslock; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								kalloc.c
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								kalloc.c
									
										
									
									
									
								
							|  | @ -23,14 +23,10 @@ struct { | ||||||
| int nfreemem; | int nfreemem; | ||||||
| 
 | 
 | ||||||
| // Initialize free list of physical pages.
 | // 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 | void | ||||||
| kinit(char *p, uint len) | kinit(char *p, uint len) | ||||||
| { | { | ||||||
|   initlock(&kmem.lock, "kmem"); |   initlock(&kmem.lock, "kmem"); | ||||||
|   cprintf("end 0x%x free = %d(0x%x)\n", p, len); |  | ||||||
|   nfreemem = 0; |   nfreemem = 0; | ||||||
|   kfree(p, len); |   kfree(p, len); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -100,6 +100,7 @@ extern int sys_sleep(void); | ||||||
| extern int sys_unlink(void); | extern int sys_unlink(void); | ||||||
| extern int sys_wait(void); | extern int sys_wait(void); | ||||||
| extern int sys_write(void); | extern int sys_write(void); | ||||||
|  | extern int sys_uptime(void); | ||||||
| 
 | 
 | ||||||
| static int (*syscalls[])(void) = { | static int (*syscalls[])(void) = { | ||||||
| [SYS_chdir]   sys_chdir, | [SYS_chdir]   sys_chdir, | ||||||
|  | @ -122,6 +123,7 @@ static int (*syscalls[])(void) = { | ||||||
| [SYS_unlink]  sys_unlink, | [SYS_unlink]  sys_unlink, | ||||||
| [SYS_wait]    sys_wait, | [SYS_wait]    sys_wait, | ||||||
| [SYS_write]   sys_write, | [SYS_write]   sys_write, | ||||||
|  | [SYS_uptime]  sys_uptime, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
|  |  | ||||||
|  | @ -19,3 +19,4 @@ | ||||||
| #define SYS_getpid 18 | #define SYS_getpid 18 | ||||||
| #define SYS_sbrk   19 | #define SYS_sbrk   19 | ||||||
| #define SYS_sleep  20 | #define SYS_sleep  20 | ||||||
|  | #define SYS_uptime 21 | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								sysproc.c
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								sysproc.c
									
										
									
									
									
								
							|  | @ -57,7 +57,8 @@ sys_sbrk(void) | ||||||
| int | int | ||||||
| sys_sleep(void) | sys_sleep(void) | ||||||
| { | { | ||||||
|   int n, ticks0; |   int n; | ||||||
|  |   uint ticks0; | ||||||
|    |    | ||||||
|   if(argint(0, &n) < 0) |   if(argint(0, &n) < 0) | ||||||
|     return -1; |     return -1; | ||||||
|  | @ -73,3 +74,16 @@ sys_sleep(void) | ||||||
|   release(&tickslock); |   release(&tickslock); | ||||||
|   return 0; |   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; | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								trap.c
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								trap.c
									
										
									
									
									
								
							|  | @ -11,7 +11,7 @@ | ||||||
| struct gatedesc idt[256]; | struct gatedesc idt[256]; | ||||||
| extern uint vectors[];  // in vectors.S: array of 256 entry pointers
 | extern uint vectors[];  // in vectors.S: array of 256 entry pointers
 | ||||||
| struct spinlock tickslock; | struct spinlock tickslock; | ||||||
| int ticks; | uint ticks; | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| tvinit(void) | tvinit(void) | ||||||
|  |  | ||||||
							
								
								
									
										24
									
								
								usertests.c
									
										
									
									
									
								
							
							
						
						
									
										24
									
								
								usertests.c
									
										
									
									
									
								
							|  | @ -322,8 +322,9 @@ void | ||||||
| mem(void) | mem(void) | ||||||
| { | { | ||||||
|   void *m1, *m2; |   void *m1, *m2; | ||||||
|   int pid; |   int pid, ppid; | ||||||
| 
 | 
 | ||||||
|  |   ppid = getpid(); | ||||||
|   if((pid = fork()) == 0){ |   if((pid = fork()) == 0){ | ||||||
|     m1 = 0; |     m1 = 0; | ||||||
|     while((m2 = malloc(10001)) != 0) { |     while((m2 = malloc(10001)) != 0) { | ||||||
|  | @ -338,6 +339,7 @@ mem(void) | ||||||
|     m1 = malloc(1024*20); |     m1 = malloc(1024*20); | ||||||
|     if(m1 == 0) { |     if(m1 == 0) { | ||||||
|       printf(1, "couldn't allocate mem?!!\n"); |       printf(1, "couldn't allocate mem?!!\n"); | ||||||
|  |       kill(ppid); | ||||||
|       exit(); |       exit(); | ||||||
|     } |     } | ||||||
|     free(m1); |     free(m1); | ||||||
|  | @ -1233,6 +1235,7 @@ void | ||||||
| sbrktest(void) | sbrktest(void) | ||||||
| { | { | ||||||
|   int pid; |   int pid; | ||||||
|  |   char *oldbrk = sbrk(0); | ||||||
| 
 | 
 | ||||||
|   printf(stdout, "sbrk test\n"); |   printf(stdout, "sbrk test\n"); | ||||||
| 
 | 
 | ||||||
|  | @ -1313,6 +1316,25 @@ sbrktest(void) | ||||||
|     exit(); |     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"); |   printf(stdout, "sbrk test OK\n"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								usys.S
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								usys.S
									
										
									
									
									
								
							|  | @ -28,3 +28,4 @@ SYSCALL(dup) | ||||||
| SYSCALL(getpid) | SYSCALL(getpid) | ||||||
| SYSCALL(sbrk) | SYSCALL(sbrk) | ||||||
| SYSCALL(sleep) | SYSCALL(sleep) | ||||||
|  | SYSCALL(uptime) | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								vm.c
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								vm.c
									
										
									
									
									
								
							|  | @ -29,7 +29,7 @@ | ||||||
| // (both in physical memory and in the kernel's virtual address
 | // (both in physical memory and in the kernel's virtual address
 | ||||||
| // space).
 | // space).
 | ||||||
| 
 | 
 | ||||||
| #define PHYSTOP  0x300000 | #define PHYSTOP  0x1000000 | ||||||
| #define USERTOP  0xA0000 | #define USERTOP  0xA0000 | ||||||
| 
 | 
 | ||||||
| static uint kerntext;  // Linker starts kernel at 1MB
 | static uint kerntext;  // Linker starts kernel at 1MB
 | ||||||
|  | @ -336,6 +336,8 @@ copyuvm(pde_t *pgdir, uint sz) | ||||||
| 
 | 
 | ||||||
| // Gather information about physical memory layout.
 | // Gather information about physical memory layout.
 | ||||||
| // Called once during boot.
 | // Called once during boot.
 | ||||||
|  | // Really should find out how much physical memory
 | ||||||
|  | // there is rather than assuming PHYSTOP.
 | ||||||
| void | void | ||||||
| pminit(void) | pminit(void) | ||||||
| { | { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Robert Morris
						Robert Morris