summaryrefslogtreecommitdiff
path: root/src/kernel/mm
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-01-02 10:09:37 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-01-02 10:09:37 +0800
commit1c8e37f63d413a559825020289178d442537449e (patch)
tree9779a712b5eec91035272e7646eb6811979d7eab /src/kernel/mm
parentd8eaa13f2efc1eeca4e5f230d5a2d535aaf27338 (diff)
downloadlume-1c8e37f63d413a559825020289178d442537449e.tar.gz
lume-1c8e37f63d413a559825020289178d442537449e.tar.xz
dev(sell): add simple libc and implement shell
please see the log for detail.
Diffstat (limited to 'src/kernel/mm')
-rw-r--r--src/kernel/mm/pmm.cc12
-rw-r--r--src/kernel/mm/vm.cc29
2 files changed, 35 insertions, 6 deletions
diff --git a/src/kernel/mm/pmm.cc b/src/kernel/mm/pmm.cc
index 3474a49..e871d8a 100644
--- a/src/kernel/mm/pmm.cc
+++ b/src/kernel/mm/pmm.cc
@@ -75,7 +75,7 @@ namespace PMM
uint64 kern_end_pa = PGROUNDUP((uint64)kernel_end);
total_pages = (PHYSTOP - KERNBASE) / PGSIZE;
- Drivers::uart_puts("PMM: Total RAM size: 128MB\n");
+ Drivers::uart_puts(ANSI_GREEN "[PMM] Total RAM size: 128MB\n" ANSI_RESET);
// Place the mem_map array
// mem_map is located immediately after kernel_end
mem_map = (struct Page*)kern_end_pa;
@@ -83,17 +83,17 @@ namespace PMM
uint64 mem_map_size = total_pages * sizeof(struct Page);
uint64 free_mem_start = PGROUNDUP(kern_end_pa + mem_map_size);
- Drivers::uart_puts("PMM: MemMap placed at: ");
+ Drivers::uart_puts(ANSI_GREEN "[PMM] MemMap placed at: " );
Drivers::print_hex((uint64)mem_map);
- Drivers::uart_putc('\n');
+ Drivers::uart_puts("\n" ANSI_RESET);
- Drivers::uart_puts("PMM: Free memory starts at: ");
+ Drivers::uart_puts(ANSI_GREEN "[PMM] Free memory starts at: ");
Drivers::print_hex(free_mem_start);
- Drivers::uart_puts("\n");
+ Drivers::uart_puts("\n" ANSI_RESET);
if (free_mem_start >= PHYSTOP)
{
- Drivers::uart_puts("PMM: Error - Kernel too large, no memory left!\n");
+ Drivers::uart_puts(ANSI_RED "[PMM] Error - Kernel too large, no memory left!\n" ANSI_RESET);
while (1)
;
}
diff --git a/src/kernel/mm/vm.cc b/src/kernel/mm/vm.cc
index 29e9eb7..41d1aa1 100644
--- a/src/kernel/mm/vm.cc
+++ b/src/kernel/mm/vm.cc
@@ -261,6 +261,8 @@ namespace VM
return 0;
}
+ int handle_cow_fault(uint64 *pagetable, uint64 va);
+
int copyout(uint64 *pagetable, uint64 dstva, char *src, uint64 len)
{
uint64 n, va0, pa0;
@@ -273,6 +275,17 @@ namespace VM
if (pte == nullptr || (*pte & PTE_V) == 0 || (*pte & PTE_U) == 0)
return -1;
+ // Note: Maybe a bug
+ if (*pte & PTE_COW)
+ {
+ if (handle_cow_fault(pagetable, va0) < 0)
+ return -1;
+ // Re-walk because handle_cow_fault replaced the page mapping
+ pte = walk(pagetable, va0, 0);
+ if (pte == nullptr || (*pte & PTE_V) == 0 || (*pte & PTE_U) == 0)
+ return -1;
+ }
+
pa0 = PTE2PA(*pte);
n = PGSIZE - (dstva - va0);
if (n > len)
@@ -419,4 +432,20 @@ namespace VM
sfence_vma();
Drivers::uart_puts("[Boot] MMU ENABLED! Using virtual addresses.\n");
}
+
+ uint64 walkaddr(uint64 *pagetable, uint64 va)
+ {
+ uint64 *pte;
+ uint64 pa;
+
+ if (va >= MAXVA)
+ return 0;
+
+ pte = walk(pagetable, va, 0);
+ if (pte == 0 || (*pte & PTE_V) == 0 || (*pte & PTE_U) == 0)
+ return 0;
+
+ pa = PTE2PA(*pte);
+ return pa;
+ }
} \ No newline at end of file