aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/mm/pmm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/mm/pmm.cpp')
-rw-r--r--kernel/mm/pmm.cpp59
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