Simplify inituvm and userinit by assuming initcode fits on a page
This commit is contained in:
parent
b3cfd7fc37
commit
f53e6110be
3 changed files with 10 additions and 19 deletions
2
defs.h
2
defs.h
|
@ -160,7 +160,7 @@ char* uva2ka(pde_t*, char*);
|
|||
int allocuvm(pde_t*, char*, uint);
|
||||
int deallocuvm(pde_t *pgdir, char *addr, uint sz);
|
||||
void freevm(pde_t*);
|
||||
void inituvm(pde_t*, char*, char*, uint);
|
||||
void inituvm(pde_t*, char*, uint);
|
||||
int loaduvm(pde_t*, char*, struct inode *ip, uint, uint);
|
||||
pde_t* copyuvm(pde_t*,uint);
|
||||
void switchuvm(struct proc*);
|
||||
|
|
7
proc.c
7
proc.c
|
@ -120,11 +120,8 @@ userinit(void)
|
|||
initproc = p;
|
||||
if(!(p->pgdir = setupkvm()))
|
||||
panic("userinit: out of memory?");
|
||||
if(!allocuvm(p->pgdir, 0x0, (int)_binary_initcode_size))
|
||||
panic("userinit: out of memory?");
|
||||
inituvm(p->pgdir, 0x0, _binary_initcode_start,
|
||||
(int)_binary_initcode_size);
|
||||
p->sz = PGROUNDUP((int)_binary_initcode_size);
|
||||
inituvm(p->pgdir, _binary_initcode_start, (int)_binary_initcode_size);
|
||||
p->sz = PGSIZE;
|
||||
memset(p->tf, 0, sizeof(*p->tf));
|
||||
p->tf->cs = (SEG_UCODE << 3) | DPL_USER;
|
||||
p->tf->ds = (SEG_UDATA << 3) | DPL_USER;
|
||||
|
|
20
vm.c
20
vm.c
|
@ -267,20 +267,14 @@ loaduvm(pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz)
|
|||
}
|
||||
|
||||
void
|
||||
inituvm(pde_t *pgdir, char *addr, char *init, uint sz)
|
||||
inituvm(pde_t *pgdir, char *init, uint sz)
|
||||
{
|
||||
uint i, pa, n, off;
|
||||
pte_t *pte;
|
||||
|
||||
for(i = 0; i < sz; i += PGSIZE){
|
||||
if(!(pte = walkpgdir(pgdir, (void *)(i+addr), 0)))
|
||||
panic("inituvm: pte should exist\n");
|
||||
off = (i+(uint)addr) % PGSIZE;
|
||||
pa = PTE_ADDR(*pte);
|
||||
if(sz - i < PGSIZE) n = sz - i;
|
||||
else n = PGSIZE;
|
||||
memmove((char *)pa+off, init+i, n);
|
||||
}
|
||||
char *mem = kalloc();
|
||||
if (sz >= PGSIZE)
|
||||
panic("inituvm: more than a page");
|
||||
memset(mem, 0, PGSIZE);
|
||||
mappages(pgdir, 0, PGSIZE, PADDR(mem), PTE_W|PTE_U);
|
||||
memmove(mem, init, sz);
|
||||
}
|
||||
|
||||
// given a parent process's page table, create a copy
|
||||
|
|
Loading…
Reference in a new issue