diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2026-01-02 10:09:37 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2026-01-02 10:09:37 +0800 |
| commit | 1c8e37f63d413a559825020289178d442537449e (patch) | |
| tree | 9779a712b5eec91035272e7646eb6811979d7eab /src/kernel/mm | |
| parent | d8eaa13f2efc1eeca4e5f230d5a2d535aaf27338 (diff) | |
| download | lume-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.cc | 12 | ||||
| -rw-r--r-- | src/kernel/mm/vm.cc | 29 |
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 |
