BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / 5611731e10cf25da1e6ba21a2b932c6599d1f62b / memory

// Related

Nucleus

Barry Setup copy-on-write for cloned page directories 5611731 (3 years, 2 months ago)
diff --git a/memory/paging.c b/memory/paging.c
index ef591f1..75d762a 100644
--- a/memory/paging.c
+++ b/memory/paging.c
@@ -88,11 +88,19 @@ clone_dir(void)
 				continue;
 			}
 
-			/* Copy page frame content */
-			newTable[pg] = alloc_frame() | PAGE_ATTR(oldTable[pg]);
-			flush_tlb(((tbl * 1024) + pg) << 12);
-			copy_page_frame(PAGE_ADDR(oldTable[pg]),
-			                PAGE_ADDR(newTable[pg]));
+			/* Link the pages for Copy-On-Write */
+			if (tbl < 960) { /* 0xF0000000 */
+				oldTable[pg] &= ~PTE_WRITE;
+				flush_tlb(((tbl * 1024) + pg) << 12);
+				newTable[pg] = oldTable[pg];
+			} else {
+				/* Copy the kernel stack area immediately */
+				newTable[pg] = alloc_frame()
+				             | PAGE_ATTR(oldTable[pg]);
+				flush_tlb(((tbl * 1024) + pg) << 12);
+				copy_page_frame(PAGE_ADDR(oldTable[pg]),
+				                PAGE_ADDR(newTable[pg]));
+			}
 		}
 	}
 	newTables[1023] = oldTables[1022];