diff options
| author | EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> | 2024-06-15 01:36:51 -0400 |
|---|---|---|
| committer | EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> | 2024-06-15 01:36:51 -0400 |
| commit | cda5a0192f1435cd875fbfc783ddaf538f1c0e5e (patch) | |
| tree | 4e6351a99224fa478cdf2e21752180979082ddff | |
| parent | 8322f42a0b23ed5bd9c40e64b204f0dad935ff63 (diff) | |
Unfinished bitmap attempt. Likely will not use.
| -rw-r--r-- | kernel/include/mm/pmm.h | 13 | ||||
| -rw-r--r-- | kernel/mm/pmm.cpp | 59 |
2 files changed, 34 insertions, 38 deletions
diff --git a/kernel/include/mm/pmm.h b/kernel/include/mm/pmm.h index c81438f..36c5f83 100644 --- a/kernel/include/mm/pmm.h +++ b/kernel/include/mm/pmm.h @@ -5,8 +5,17 @@ #include <stddef.h> #include <limine.h> -struct pmm_list_node { - pmm_list_node* next; +struct MemRegion { + uint64_t base; + uint64_t length; + uint64_t bitmap_pos; // where the region starts on the bitmap index +}; + +struct BitmapInfo { + uint64_t* address; + uint64_t ind_length; + int region_count; + MemRegion* regions[]; }; void pmm_init(limine_memmap_response* memmap); 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 |
