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];