提交 d0347377 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

works, except no vma growing yet

上级 792497fa
...@@ -67,7 +67,8 @@ exec(char *path, char **argv) ...@@ -67,7 +67,8 @@ exec(char *path, char **argv)
ip = 0; ip = 0;
// Allocate a vmnode for the heap. // Allocate a vmnode for the heap.
if((vmn = vmn_allocpg(1)) == 0) // XXX pre-allocate 32 pages..
if((vmn = vmn_allocpg(32)) == 0)
goto bad; goto bad;
if(vmap_insert(vmap, vmn, brk) < 0) if(vmap_insert(vmap, vmn, brk) < 0)
goto bad; goto bad;
...@@ -112,7 +113,7 @@ exec(char *path, char **argv) ...@@ -112,7 +113,7 @@ exec(char *path, char **argv)
oldvmap = proc->vmap; oldvmap = proc->vmap;
proc->pgdir = pgdir; proc->pgdir = pgdir;
proc->vmap = vmap; proc->vmap = vmap;
proc->brk = brk; proc->brk = brk + 4; // XXX so that brk-1 points within heap vma..
proc->tf->eip = elf.entry; // main proc->tf->eip = elf.entry; // main
proc->tf->esp = sp; proc->tf->esp = sp;
switchuvm(proc); switchuvm(proc);
......
...@@ -116,13 +116,19 @@ growproc(int n) ...@@ -116,13 +116,19 @@ growproc(int n)
uint brk = proc->brk; uint brk = proc->brk;
uint nbrk = brk + n; uint nbrk = brk + n;
struct vma *vma = vmap_lookup(proc->vmap, brk-1);
if(vma == 0)
return -1;
if(nbrk > vma->va_end){
/* XXX */ /* XXX */
if(brk / PGSIZE != nbrk / PGSIZE) { release(&vma->lock);
cprintf("cannot resize heap\n"); cprintf("cannot resize heap: %d -> %d\n", brk, nbrk);
return -1; return -1;
} }
proc->brk = brk + n; proc->brk = brk + n;
release(&vma->lock);
switchuvm(proc); switchuvm(proc);
return 0; return 0;
} }
......
...@@ -185,7 +185,7 @@ switchuvm(struct proc *p) ...@@ -185,7 +185,7 @@ switchuvm(struct proc *p)
} }
struct { struct {
struct vmnode n[128]; struct vmnode n[1024];
} vmnodes; } vmnodes;
struct { struct {
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论