From 588884418a2dd0110209ef1673c4ab0c47173254 Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Tue, 30 Dec 2025 13:11:56 +0800 Subject: dev(pmm.h): refactor header file --- include/kernel/pmm.h | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) (limited to 'include') diff --git a/include/kernel/pmm.h b/include/kernel/pmm.h index 3328450..7156c76 100644 --- a/include/kernel/pmm.h +++ b/include/kernel/pmm.h @@ -1,13 +1,53 @@ #pragma once #include "common/types.h" +#include "kernel/spinlock.h" + +// Physical Memory Layout Definition +#define KERNBASE 0x80000000 +// Set the memory size to 128MB +#define PHYSIZE (128 * 1024 * 1024) +#define PHYSTOP (KERNBASE + PHYSIZE) -#define PHYSTOP (0x80000000 + 128 * 1024 * 1024) #define PGSIZE 4096 +#define PGSHIFT 12 + +// 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) -namespace PMM{ +// 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(); - void* alloc_page(); + // 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); - void free_page(void* pa); + // Debug information + void print_free_lists(); } \ No newline at end of file -- cgit v1.2.3