瀏覽代碼

starting paging, but got annoyed

tarfeef101 6 年之前
父節點
當前提交
a92e4bde61
共有 5 個文件被更改,包括 82 次插入31 次删除
  1. 67 22
      kern/arch/mips/vm/dumbvm.c
  2. 二進制
      kern/compile/ASST3/kernel
  3. 1 1
      kern/compile/ASST3/vers.c
  4. 1 1
      kern/compile/ASST3/version
  5. 13 7
      kern/include/addrspace.h

+ 67 - 22
kern/arch/mips/vm/dumbvm.c

@@ -350,14 +350,9 @@ struct addrspace * as_create(void)
 		return NULL;
 	}
 
-	as->as_vbase1 = 0;
-	as->as_pbase1 = 0;
-	as->as_npages1 = 0;
-	as->as_vbase2 = 0;
-	as->as_pbase2 = 0;
-	as->as_npages2 = 0;
-	as->as_stackpbase = 0;
-	as->loading = true;
+	as->pt = NULL;
+	as->regions = 0;
+	as->pages = 0;
 
 	return as;
 }
@@ -420,22 +415,52 @@ as_define_region(struct addrspace *as, vaddr_t vaddr, size_t sz,
 	(void)readable;
 	(void)writeable;
 	(void)executable;
-
-	if (as->as_vbase1 == 0) {
-		as->as_vbase1 = vaddr;
-		as->as_npages1 = npages;
-		return 0;
+	
+	if (as->regions > 2) goto skip3;
+	
+	// code segment not inited yet
+	if (!(as->regions))
+	{
+	  as->pt = kmalloc(npages * sizeof(struct pte));
+	  for (int i = 0; i < npages; ++i)
+	  {
+	    pt[i].section = 0;
+	    pt[i].pageStart = NULL;
+	    pt[i].frame = -1;
+	  }
+	  ++as->regions;
+	  as->pages += npages;
+	  return 0;
 	}
-
-	if (as->as_vbase2 == 0) {
-		as->as_vbase2 = vaddr;
-		as->as_npages2 = npages;
-		return 0;
+	
+	// this is the data segment
+	if (as->regions == 1)
+	{
+	  // alloc new pt, copy over data
+	  struct pte * temp = kmalloc((npages + as->pages) * sizeof(struct pte));
+	  for (int i = 0; i < as->pages; ++i)
+	  {
+	    temp[i] = as->pt[i];
+	  }
+	  
+	  // fill in new section's entries
+	  for (int i = as->pages; i < (npages + as->pages); ++i)
+	  {
+	    temp[i].section = 1;
+	    temp[i].pageStart = NULL;
+	    temp[i].frame = -1;
+	  }
+	  kfree(as->pt);
+	  as->pt = temp;
+	  ++as->regions;
+	  as->pages += npages;
+	  return 0;
 	}
 
 	/*
 	 * Support for more than two regions is not available.
 	 */
+	skip3:
 	kprintf("dumbvm: Warning: too many regions\n");
 	return EUNIMP;
 }
@@ -450,10 +475,30 @@ as_zero_region(paddr_t paddr, unsigned npages)
 int
 as_prepare_load(struct addrspace *as)
 {
-	KASSERT(as->as_pbase1 == 0);
-	KASSERT(as->as_pbase2 == 0);
-	KASSERT(as->as_stackpbase == 0);
-
+  // alloc new pt, copy over data
+	struct pte * temp = kmalloc((DUMBVM_STACKPAGES + as->pages) * sizeof(struct pte));
+	for (int i = 0; i < as->pages; ++i)
+	{
+	  temp[i] = as->pt[i];
+	}
+	
+	// fill in stack section's entries
+	for (int i = as->pages; i < (DUMBVM_STACKPAGES + as->pages); ++i)
+	{
+	  temp[i].section = 2;
+	  temp[i].pageStart = NULL;
+	  temp[i].frame = -1;
+	}
+	++as->regions;
+	as->pages += DUMBVM_STACKPAGES;
+  
+  
+  for (int i = 0; i < as->pages; +=i)
+  {
+    as->pt[i].pageStart
+  }
+  
+  
 	as->as_pbase1 = alloc_kpages(as->as_npages1) - MIPS_KSEG0;
 	if (as->as_pbase1 == 0) {
 		return ENOMEM;

二進制
kern/compile/ASST3/kernel


+ 1 - 1
kern/compile/ASST3/vers.c

@@ -1,3 +1,3 @@
 /* This file is automatically generated. Edits will be lost.*/
-const int buildversion = 28;
+const int buildversion = 29;
 const char buildconfig[] = "ASST3";

+ 1 - 1
kern/compile/ASST3/version

@@ -1 +1 @@
-28
+29

+ 13 - 7
kern/include/addrspace.h

@@ -47,16 +47,22 @@ struct vnode;
  * You write this.
  */
 
+// section is 0 for code, 1 for data, 2 for stack
+// pageStart is the vaddr_t where this page starts
+// frame is the frame # this maps to
+struct pte
+{
+  int section;
+  vaddr_t pageStart;
+  int frame;
+};
+
 struct addrspace
 {
-  vaddr_t as_vbase1;
-  paddr_t as_pbase1;
-  size_t as_npages1;
-  vaddr_t as_vbase2;
-  paddr_t as_pbase2;
-  size_t as_npages2;
-  paddr_t as_stackpbase;
   bool loading;
+  int regions;
+  struct pte * pt;
+  int pages;
 };
 
 /*