summaryrefslogtreecommitdiff
path: root/lume-legacy/include/kernel/pmm.h
diff options
context:
space:
mode:
Diffstat (limited to 'lume-legacy/include/kernel/pmm.h')
-rw-r--r--lume-legacy/include/kernel/pmm.h60
1 files changed, 60 insertions, 0 deletions
diff --git a/lume-legacy/include/kernel/pmm.h b/lume-legacy/include/kernel/pmm.h
new file mode 100644
index 0000000..261786d
--- /dev/null
+++ b/lume-legacy/include/kernel/pmm.h
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2026 Richard Qin
+ */
+
+#pragma once
+#include "common/types.h"
+#include "kernel/spinlock.h"
+#include "kernel/fdt.h" // For g_devices
+
+// Physical Memory Layout Definition
+#define KERNBASE 0x80000000
+
+// Dynamic memory size from FDT
+// Default to 128MB if FDT not present/parsed
+extern uint64 g_phys_size;
+
+#define PHYSIZE (g_phys_size)
+#define PHYSTOP (KERNBASE + PHYSIZE)
+
+// Buddy System Max Order
+// Order 10 => 2^10 pages = 1024 * 4KB = 4MB contiguous block
+// Order 11 => 2^11 pages = 8MB
+#define MAX_ORDER 11
+
+// Page flag
+#define PG_used 0x01 // This page is occupied
+#define PG_reserved 0x02 // This page is reserved (kernel code/data, DTB, MemMap)
+
+// Physical Page Metadata Structure
+struct Page
+{
+ uint8 flags; // Page Status (PG_used, PG_reserved)
+ uint8 order; // If it is the first page of a free block, record the order of the current block
+ uint16 refcnt; // Reference Counting
+ struct Page *next; // Free list pointer (points to the next free block of the same size)
+ struct Page *prev; // Doubly linked list (easy to remove)
+};
+
+namespace PMM
+{
+ // Initialize physical memory management
+ void init();
+
+ // Core Allocation Interface (Buddy System)
+ // order: 0 ~ MAX_ORDER-1
+ void *alloc_pages(int order);
+ void free_pages(void *pa, int order);
+
+ // Compatible with old interface (allocate single page with order=0 and automatically reset to zero)
+ void *alloc_page();
+ void free_page(void *pa);
+
+ // Helper function
+ struct Page *pa_to_page(uint64 pa);
+ uint64 page_to_pa(struct Page *page);
+
+ // Debug information
+ void print_free_lists();
+} \ No newline at end of file