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
		
		Reference in a new issue