Espresso 0.0.2c
This commit is contained in:
@ -111,7 +111,12 @@ void free(void* ptr)
|
||||
block_t* curr = free_list;
|
||||
while (curr && curr->next)
|
||||
{
|
||||
if (curr->free && curr->next->free)
|
||||
/*if (curr->free && curr->next->free)
|
||||
{
|
||||
curr->size += BLOCK_SIZE + curr->next->size;
|
||||
curr->next = curr->next->next;
|
||||
}*/
|
||||
if (curr->free && curr->next->free && (uint8_t*)curr + BLOCK_SIZE + curr->size == (uint8_t*)curr->next)
|
||||
{
|
||||
curr->size += BLOCK_SIZE + curr->next->size;
|
||||
curr->next = curr->next->next;
|
||||
|
||||
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