modify each page in usertests countfree()
get rid of static for walk() and freewalk()
This commit is contained in:
		
							parent
							
								
									2ae9c8e272
								
							
						
					
					
						commit
						7f35d7a14e
					
				
					 4 changed files with 11 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -20,6 +20,7 @@ static void wakeup1(struct proc *chan);
 | 
			
		|||
 | 
			
		||||
extern char trampoline[]; // trampoline.S
 | 
			
		||||
 | 
			
		||||
// initialize the proc table at boot time.
 | 
			
		||||
void
 | 
			
		||||
procinit(void)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -145,8 +146,8 @@ freeproc(struct proc *p)
 | 
			
		|||
  p->state = UNUSED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Create a page table for a given process,
 | 
			
		||||
// with no user pages, but with trampoline pages.
 | 
			
		||||
// Create a user page table for a given process,
 | 
			
		||||
// with no user memory, but with trampoline pages.
 | 
			
		||||
pagetable_t
 | 
			
		||||
proc_pagetable(struct proc *p)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -97,7 +97,7 @@ struct proc {
 | 
			
		|||
  // these are private to the process, so p->lock need not be held.
 | 
			
		||||
  uint64 kstack;               // Virtual address of kernel stack
 | 
			
		||||
  uint64 sz;                   // Size of process memory (bytes)
 | 
			
		||||
  pagetable_t pagetable;       // Page table
 | 
			
		||||
  pagetable_t pagetable;       // User page table
 | 
			
		||||
  struct trapframe *trapframe; // data page for trampoline.S
 | 
			
		||||
  struct context context;      // swtch() here to run process
 | 
			
		||||
  struct file *ofile[NOFILE];  // Open files
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,9 +16,7 @@ extern char etext[];  // kernel.ld sets this to end of kernel code.
 | 
			
		|||
extern char trampoline[]; // trampoline.S
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * create a direct-map page table for the kernel and
 | 
			
		||||
 * turn on paging. called early, in supervisor mode.
 | 
			
		||||
 * the page allocator is already initialized.
 | 
			
		||||
 * create a direct-map page table for the kernel.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
kvminit()
 | 
			
		||||
| 
						 | 
				
			
			@ -70,7 +68,7 @@ kvminithart()
 | 
			
		|||
//   21..39 -- 9 bits of level-1 index.
 | 
			
		||||
//   12..20 -- 9 bits of level-0 index.
 | 
			
		||||
//    0..12 -- 12 bits of byte offset within the page.
 | 
			
		||||
static pte_t *
 | 
			
		||||
pte_t *
 | 
			
		||||
walk(pagetable_t pagetable, uint64 va, int alloc)
 | 
			
		||||
{
 | 
			
		||||
  if(va >= MAXVA)
 | 
			
		||||
| 
						 | 
				
			
			@ -278,7 +276,7 @@ uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz)
 | 
			
		|||
 | 
			
		||||
// Recursively free page-table pages.
 | 
			
		||||
// All leaf mappings must already have been removed.
 | 
			
		||||
static void
 | 
			
		||||
void
 | 
			
		||||
freewalk(pagetable_t pagetable)
 | 
			
		||||
{
 | 
			
		||||
  // there are 2^9 = 512 PTEs in a page table.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2251,9 +2251,12 @@ countfree()
 | 
			
		|||
  int n = 0;
 | 
			
		||||
 | 
			
		||||
  while(1){
 | 
			
		||||
    if((uint64)sbrk(4096) == 0xffffffffffffffff){
 | 
			
		||||
    uint64 a = (uint64) sbrk(4096);
 | 
			
		||||
    if(a == 0xffffffffffffffff){
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    // modify the memory to make sure it's really allocated.
 | 
			
		||||
    *(char *)(a - 1) = 1;
 | 
			
		||||
    n += 1;
 | 
			
		||||
  }
 | 
			
		||||
  sbrk(-((uint64)sbrk(0) - sz0));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue