diff options
Diffstat (limited to 'kernel/mm/pmm.cpp')
| -rw-r--r-- | kernel/mm/pmm.cpp | 59 |
1 files changed, 23 insertions, 36 deletions
diff --git a/kernel/mm/pmm.cpp b/kernel/mm/pmm.cpp index 632bc1d..1234d8a 100644 --- a/kernel/mm/pmm.cpp +++ b/kernel/mm/pmm.cpp @@ -2,56 +2,43 @@ #include <kernel.h> #include <stdio.h> -pmm_list_node* head; -pmm_list_node* tail; - -void pmm_init(limine_memmap_response* memmap) { +// Finds biggest memory chunk to place the bitmap +static int find_biggest_chunk(limine_memmap_response* memmap) { + int biggestmem = 0; + int biggestindex = 0; for (size_t i = 0; i < memmap->entry_count; i++) { - if (memmap->entries[i]->type != LIMINE_MEMMAP_USABLE) { - continue; - } - - // Puts a node into each page of usable physical memory - - if (head != nullptr) { - head->next = (pmm_list_node*)(memmap->entries[i]->base + _hhdm_offset); + if (memmap->entries[i]->length > biggestmem) { + biggestmem = memmap->entries[i]->length; + biggestindex = i; } + } - if (tail != nullptr) { - tail = (pmm_list_node*)(memmap->entries[i]->base + _hhdm_offset); - } + return biggestindex; +} - for (size_t j = 0; j < memmap->entries[i]->length; j += 0x1000) { - pmm_list_node* page = (pmm_list_node*)(memmap->entries[i]->base + j + _hhdm_offset); - //head->next = page; - page->next = page + 0x1000; - head = page; - //tail = page; - } - } +static MemRegion** setup_meminfo(limine_memmap_response* memmap, int chunk) { + const uint64_t* basemem = (uint64_t*)memmap->entries[chunk]->base; + int use_count = 1; // for placing structures in the right location - // sets head->next to first set page for (size_t i = 0; i < memmap->entry_count; i++) { - if (memmap->entries[i] == LIMINE_MEMMAP_USABLE) { - head->next = tail; - // head = (pmm_list_node*)(memmap->entries[i]->base + _hhdm_offset); - //tail->next = head; - break; + if (memmap->entries[i]->type == LIMINE_MEMMAP_USABLE) { + } } +} + +void pmm_init(limine_memmap_response* memmap) { + int chunk = find_biggest_chunk(memmap); + + setup_meminfo(memmap, chunk); printf("Initialized PMM\n"); } void* palloc() { - pmm_list_node* node = head; - printf("Head: %lx\nNext: %lx\n", head, head->next); - head = head->next; - return node; + } void pfree(void* page) { - pmm_list_node* node = (pmm_list_node*)page + _hhdm_offset; - node->next = head; - head = node; + }
\ No newline at end of file |
