diff options
Diffstat (limited to 'kernel/mm/pmm.cpp')
| -rw-r--r-- | kernel/mm/pmm.cpp | 80 |
1 files changed, 41 insertions, 39 deletions
diff --git a/kernel/mm/pmm.cpp b/kernel/mm/pmm.cpp index bd8f12c..632bc1d 100644 --- a/kernel/mm/pmm.cpp +++ b/kernel/mm/pmm.cpp @@ -1,55 +1,57 @@ #include <mm/pmm.h> +#include <kernel.h> #include <stdio.h> -PBitmap bitmap; +pmm_list_node* head; +pmm_list_node* tail; -// Finds the biggest chunk of memory -static MMEntry find_mem_chunk(limine_memmap_response* memmap) { - uint64_t highestmem = 0; - size_t highestindex = 0; - limine_memmap_entry* entries = memmap->entries[0]; +void pmm_init(limine_memmap_response* memmap) { for (size_t i = 0; i < memmap->entry_count; i++) { - if (entries[i].type == LIMINE_MEMMAP_USABLE && entries[i].length > highestmem) { - highestmem = entries[i].length; - highestindex = i; + if (memmap->entries[i]->type != LIMINE_MEMMAP_USABLE) { + continue; } - } - - return MMEntry{ - entries[highestindex].base, - entries[highestindex].length, - MEM_USABLE - }; -} -void pmm_init(limine_memmap_response* memmap, uint64_t hhdm_offset) { - MMEntry mem_entry = find_mem_chunk(memmap); - - // Round any numbers needed to 4K boudaries - //mem_entry.base += 4096 - (mem_entry.base % 4096); - mem_entry.length -= mem_entry.length % 4096; - - // setup bitmap at the beginning of the chunk - bitmap.entry = mem_entry; - bitmap.addr = (uint64_t*)(bitmap.entry.base + hhdm_offset); - // divided by byte size since size is for iterating over the bitmap - bitmap.size = mem_entry.length / 4096 / sizeof(uint64_t); + // Puts a node into each page of usable physical memory + + if (head != nullptr) { + head->next = (pmm_list_node*)(memmap->entries[i]->base + _hhdm_offset); + } - printf("addr: %lx\nsize: %lx\n", (uint64_t)bitmap.addr, bitmap.size); - printf("hhdm offset: %lx\n", hhdm_offset); + if (tail != nullptr) { + tail = (pmm_list_node*)(memmap->entries[i]->base + _hhdm_offset); + } - // write test - for (size_t i = 0; i < 100; i++) { - bitmap.addr[i] = i; - //printf("value %d: %lx\n", i, bitmap.addr[i]); + 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; + } } - // read test - for (size_t i = 0; i < bitmap.size; i++) { - //printf("value %d: %lx\n"); + // 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; + } } + + printf("Initialized PMM\n"); } -uint64_t get_phys_page() { +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 |
