diff --git a/kernel/mm/vmm.c b/kernel/mm/vmm.c index cac935d..1676420 100644 --- a/kernel/mm/vmm.c +++ b/kernel/mm/vmm.c @@ -29,8 +29,9 @@ extern mb_info_t mb_info_block; extern mb_module_t mb_modules[MAX_MODULES]; extern u32_t mm_freepages; -HeapEntryQueue_t heapEntryQueues[VMM_HE_TYPES]; //sorted, linked queue of HeapEntry objects -HeapEntryBlock_t initialHEB; //block for initial 256 HeapEntry objects +HeapEntryQueue_t heapEntryQueues[VMM_HE_TYPES]; // sorted, linked queue of HeapEntry objects +HeapEntry_t heapEntryHeadNodes[VMM_HE_TYPES]; // head nodes for linked queues +HeapEntryBlock_t initialHEB; // block for initial 256 HeapEntry objects // This is the initialization procedure for the Virtual Memory Manager @@ -45,7 +46,6 @@ void vmm_init() HeapEntry_t *wilderness = vmm_stripUnusedEntry(); wilderness->base = (void *) HEAP_START; wilderness->length = HEAP_LENGTH; - wilderness->next = 0; vmm_addToQueue(VMM_HE_HOLE, wilderness); } @@ -145,7 +145,14 @@ void *vmm_palloc() { k_enter_critical(); HeapEntry_t *he = heapEntryQueues[VMM_HE_HOLE].start; - he = vmm_followChain(he); + if (he->length == 4096) + { + heapEntryQueues[VMM_HE_HOLE].start = he->next; + heapEntryQueues[VMM_HE_HOLE].count--; + he->next = 0; + vmm_addToQueue(VMM_HE_USED, he); + return he->base; + } k_leave_critical(); return NULL; @@ -187,35 +194,35 @@ void vmm_addToQueue(u32_t queue, HeapEntry_t *he) switch (queue) { - HeapEntry_t *otherhe; + HeapEntry_t *prevhe; case VMM_HE_UNUSED: // don't sort at all, add to end - otherhe = vmm_followChain(heapEntryQueues[queue].start); - otherhe->next = he; + prevhe = vmm_followChain(heapEntryQueues[queue].start); + prevhe->next = he; heapEntryQueues[queue].count += vmm_countHeapEntries(he); break; case VMM_HE_USED: // sort by base address - otherhe = heapEntryQueues[queue].start; - while (otherhe->next) + prevhe = heapEntryQueues[queue].start; + while (prevhe->next) { - if (((HeapEntry_t *)otherhe->next)->base > he->base) + if (((HeapEntry_t *)prevhe->next)->base > he->base) break; - otherhe = otherhe->next; + prevhe = prevhe->next; } - he->next = otherhe->next; - otherhe->next = he; + he->next = prevhe->next; + prevhe->next = he; heapEntryQueues[queue].count++; break; case VMM_HE_HOLE: // sort by length case VMM_HE_FREE: - otherhe = heapEntryQueues[queue].start; - while (otherhe->next) + prevhe = heapEntryQueues[queue].start; + while (prevhe->next) { - if (((HeapEntry_t *)otherhe->next)->length > he->length) + if (((HeapEntry_t *)prevhe->next)->length > he->length) break; - otherhe = otherhe->next; + prevhe = prevhe->next; } - he->next = otherhe->next; - otherhe->next = he; + he->next = prevhe->next; + prevhe->next = he; heapEntryQueues[queue].count++; break; } diff --git a/kernel/mm/vmm.h b/kernel/mm/vmm.h index cd325d0..3bd85e8 100644 --- a/kernel/mm/vmm.h +++ b/kernel/mm/vmm.h @@ -24,7 +24,7 @@ typedef struct { void *base; //virtual base address u32_t length; //size in bytes void *next; //link to next HeapEntry - u32_t padding; + void *prev; //link to previous HeapEntry } __attribute__((packed)) HeapEntry_t; typedef struct {