Espresso 0.0.2c
This commit is contained in:
24
lib/mm/pmm.c
24
lib/mm/pmm.c
@ -12,6 +12,10 @@ static size_t total_pages;
|
||||
#define BITMAP_CLEAR(i) (bitmap[(i) / 8] &= ~(1 << ((i) % 8)))
|
||||
#define BITMAP_TEST(i) (bitmap[(i) / 8] & (1 << ((i) % 8)))
|
||||
|
||||
|
||||
extern uint32_t __kernel_start;
|
||||
extern uint32_t __kernel_end;
|
||||
|
||||
void pmm_init(multiboot_info_t* mb)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
@ -45,6 +49,18 @@ void pmm_init(multiboot_info_t* mb)
|
||||
}
|
||||
}
|
||||
total_pages = MAX_PAGES;
|
||||
|
||||
uintptr_t start = (uintptr_t)&__kernel_start;
|
||||
uintptr_t end = (uintptr_t)&__kernel_end;
|
||||
|
||||
start &= ~0xFFF;
|
||||
end = (end + 0xFFF) & ~0xFFF;
|
||||
|
||||
for (uintptr_t addr = start; addr < end; addr += 0x1000)
|
||||
{
|
||||
size_t idx = addr / 0x1000;
|
||||
BITMAP_SET(idx); // Mark kernel pages as USED
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
printf("[ PMM ] Physical memory manager initialized\n");
|
||||
@ -55,6 +71,14 @@ void* pmm_alloc_page(void)
|
||||
{
|
||||
for (uint32_t i = 0; i < total_pages; ++i)
|
||||
{
|
||||
void* page = (void*)(i * 4096);
|
||||
|
||||
if ((uintptr_t)page >= (uintptr_t)&__kernel_start &&
|
||||
(uintptr_t)page < (uintptr_t)&__kernel_end)
|
||||
{
|
||||
printf("PMM allocating inside kernel at %x\n", page);
|
||||
}
|
||||
|
||||
if (!BITMAP_TEST(i))
|
||||
{
|
||||
BITMAP_SET(i);
|
||||
|
||||
Reference in New Issue
Block a user