diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2026-04-14 22:47:15 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2026-04-14 22:47:15 +0800 |
| commit | ac9741e12222e72bad3414bc6f588e70a3d130cc (patch) | |
| tree | 6aace9f63a2ea54c7c3fd1e49e98ff81b638296f /src/kernel/mm | |
| parent | 1e862099a13266da57ff7c6de11c1a11c42a8112 (diff) | |
| download | lume-ac9741e12222e72bad3414bc6f588e70a3d130cc.tar.gz lume-ac9741e12222e72bad3414bc6f588e70a3d130cc.tar.xz | |
feat: implement FDT-based memory discovery and add comprehensive debug logging to exec syscalls
Diffstat (limited to 'src/kernel/mm')
| -rw-r--r-- | src/kernel/mm/pmm.cc | 14 | ||||
| -rw-r--r-- | src/kernel/mm/vm.cc | 13 |
2 files changed, 23 insertions, 4 deletions
diff --git a/src/kernel/mm/pmm.cc b/src/kernel/mm/pmm.cc index 2d0c44f..d3d99ba 100644 --- a/src/kernel/mm/pmm.cc +++ b/src/kernel/mm/pmm.cc @@ -6,6 +6,7 @@ #include "kernel/riscv.h" #include "kernel/pmm.h" #include "kernel/mm.h" +#include "kernel/fdt.h" // #include "kernel/spinlock.h" #include "drivers/uart.h" #include "lib/string.h" @@ -13,6 +14,9 @@ extern "C" char kernel_end[]; extern uint64 g_dtb_addr; +// Default memory size 128MB, will be overwritten by FDT +uint64 g_phys_size = 128 * 1024 * 1024; + namespace PMM { // Global metadata array pointer @@ -74,12 +78,20 @@ namespace PMM void init() { + // Use FDT memory size if available + if (g_devices.mem_size > 0) + { + g_phys_size = g_devices.mem_size; + } + pmm_lock.init("pmm"); uint64 kern_end_pa = PGROUNDUP((uint64)kernel_end); total_pages = (PHYSTOP - KERNBASE) / PGSIZE; - Drivers::uart_puts(ANSI_GREEN "[PMM] Total RAM size: 128MB\n" ANSI_RESET); + Drivers::uart_puts(ANSI_GREEN "[PMM] Total RAM size: "); + Drivers::uart_put_int(g_phys_size / (1024 * 1024)); + Drivers::uart_puts(" MB\n" ANSI_RESET); // Place the mem_map array // mem_map is located immediately after kernel_end mem_map = (struct Page*)kern_end_pa; diff --git a/src/kernel/mm/vm.cc b/src/kernel/mm/vm.cc index 47b80e9..be2f2f2 100644 --- a/src/kernel/mm/vm.cc +++ b/src/kernel/mm/vm.cc @@ -8,6 +8,7 @@ #include "common/types.h" #include "lib/string.h" #include "drivers/uart.h" +#include "kernel/fdt.h" extern "C" { @@ -421,9 +422,15 @@ namespace VM { kernel_pagetable = uvmcreate(); - kvmmap(0x10000000, 0x10000000, 0x10000, PTE_R | PTE_W); - kvmmap(0x0c000000, 0x0c000000, 0x400000, PTE_R | PTE_W); - kvmmap(0x02000000, 0x02000000, 0x10000, PTE_R | PTE_W); // CLINT + // 1. Map all device MMIO regions discovered by FDT + for (int i = 0; i < g_devices.mmio_count; i++) + { + uint64 base = g_devices.mmio_regions[i].base; + uint64 size = g_devices.mmio_regions[i].size; + kvmmap(base, base, size, PTE_R | PTE_W); + } + + // 2. Map Kernel Memory (PHYSTOP is now dynamic based on FDT) kvmmap(KERNBASE, KERNBASE, PHYSTOP - KERNBASE, PTE_R | PTE_W | PTE_X); } |
