summaryrefslogtreecommitdiff
path: root/src/kernel/mm
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-01-01 15:04:47 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-01-01 15:04:47 +0800
commit2dde56422dcfb94affee2baffc8d240ad16ad4b2 (patch)
treeaeee8a0dad24ceaca22585f773411e386c8019be /src/kernel/mm
parent0a6815b7143a8ffd0e09777b5fbd12098d8884c2 (diff)
downloadlume-2dde56422dcfb94affee2baffc8d240ad16ad4b2.tar.gz
lume-2dde56422dcfb94affee2baffc8d240ad16ad4b2.tar.xz
dev(device): implement VirtIO
See dev log for detail
Diffstat (limited to 'src/kernel/mm')
-rw-r--r--src/kernel/mm/pmm.cc67
-rw-r--r--src/kernel/mm/slab.cc11
-rw-r--r--src/kernel/mm/vm.cc3
3 files changed, 11 insertions, 70 deletions
diff --git a/src/kernel/mm/pmm.cc b/src/kernel/mm/pmm.cc
index 09bd65b..3474a49 100644
--- a/src/kernel/mm/pmm.cc
+++ b/src/kernel/mm/pmm.cc
@@ -9,73 +9,6 @@
extern "C" char kernel_end[];
extern uint64 g_dtb_addr;
-// namespace PMM
-// {
-// struct Run
-// {
-// struct Run *next;
-// };
-
-// struct
-// {
-// struct Run *freelist;
-// } kmem;
-
-// inline uint64_t PGROUNDUP(uint64_t a)
-// {
-// return (a + PGSIZE - 1) & ~(PGSIZE - 1);
-// }
-
-// void init()
-// {
-// uint64_t start = PGROUNDUP((uint64_t)kernel_end);
-
-// Drivers::uart_puts("PMM: Initializing from");
-
-// for (uint64_t p = start; p + PGSIZE <= PHYSTOP; p += PGSIZE)
-// {
-// free_page((void *)p);
-// }
-// }
-
-// void free_page(void* pa)
-// {
-// struct Run *r;
-// if (((uint64_t)pa % PGSIZE) != 0 || (uint64_t)pa < (uint64_t)kernel_end || (uint64_t)pa >= PHYSTOP)
-// {
-// Drivers::uart_puts("PMM: Error - Invalid free address\n");
-// return;
-// }
-// r = (struct Run*)pa;
-
-// r->next = kmem.freelist;
-// kmem.freelist = r;
-
-// }
-
-// void* alloc_page()
-// {
-// struct Run* r;
-
-// r = kmem.freelist;
-// if (r)
-// {
-// kmem.freelist = r->next;
-
-// uint64_t *p = (uint64_t *)r;
-// for (int i = 0; i < PGSIZE / 8; i++)
-// {
-// p[i] = 0;
-// }
-// }
-// else
-// {
-// Drivers::uart_puts("PMM: Out of memory!\n");
-// }
-// return (void *)r;
-// }
-// }
-
namespace PMM
{
// Global metadata array pointer
diff --git a/src/kernel/mm/slab.cc b/src/kernel/mm/slab.cc
index 370074a..702dc5c 100644
--- a/src/kernel/mm/slab.cc
+++ b/src/kernel/mm/slab.cc
@@ -19,6 +19,7 @@ struct SlabHeader
uint16 used_count; // Number of allocated objects
// Followed immediately by object data...
// The free list of objects is embedded in the first 2 bytes of the object itself (stores the index of the next object)
+ uint32 padding;
};
struct KmemCache
@@ -82,6 +83,7 @@ namespace Slab
slab->next = nullptr;
slab->used_count = 0;
slab->free_idx = 0;
+ slab->padding = 0;
// Initialize the free list of objects
// The starting position of each object stores the index of the next object
@@ -186,7 +188,7 @@ namespace Slab
if (!page)
return;
- if (!(page->flags & PG_slab))
+ if (!page || !(page->flags & PG_slab))
{
PMM::free_pages(ptr, page->order);
return;
@@ -204,6 +206,13 @@ namespace Slab
struct SlabHeader *slab = (struct SlabHeader *)PGROUNDDOWN((uint64)ptr);
+ if ((uint64)ptr < (uint64)(slab + 1) || (uint64)ptr >= (uint64)slab + PGSIZE)
+ {
+ Drivers::uart_puts("Slab: kfree invalid pointer\n");
+ c->lock.release();
+ return;
+ }
+
char *base = (char *)(slab + 1);
int obj_idx = ((uint64)ptr - (uint64)base) / c->obj_size;
diff --git a/src/kernel/mm/vm.cc b/src/kernel/mm/vm.cc
index c3c5f01..7057d88 100644
--- a/src/kernel/mm/vm.cc
+++ b/src/kernel/mm/vm.cc
@@ -360,11 +360,10 @@ namespace VM
{
kernel_pagetable = uvmcreate();
- kvmmap(0x10000000, 0x10000000, PGSIZE, PTE_R | PTE_W);
+ 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
kvmmap(KERNBASE, KERNBASE, PHYSTOP - KERNBASE, PTE_R | PTE_W | PTE_X);
- // kvmmap(TRAMPOLINE, (uint64)trampoline, PGSIZE, PTE_R | PTE_X);
}
void kvminithart()