Import backup from 2004-07-25

This commit is contained in:
Josh Holtrop 2004-07-25 22:00:00 -04:00
parent 1063a68a21
commit 11da8cb162
2 changed files with 27 additions and 20 deletions

View File

@ -29,8 +29,9 @@ extern mb_info_t mb_info_block;
extern mb_module_t mb_modules[MAX_MODULES]; extern mb_module_t mb_modules[MAX_MODULES];
extern u32_t mm_freepages; extern u32_t mm_freepages;
HeapEntryQueue_t heapEntryQueues[VMM_HE_TYPES]; //sorted, linked queue of HeapEntry objects HeapEntryQueue_t heapEntryQueues[VMM_HE_TYPES]; // sorted, linked queue of HeapEntry objects
HeapEntryBlock_t initialHEB; //block for initial 256 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 // This is the initialization procedure for the Virtual Memory Manager
@ -45,7 +46,6 @@ void vmm_init()
HeapEntry_t *wilderness = vmm_stripUnusedEntry(); HeapEntry_t *wilderness = vmm_stripUnusedEntry();
wilderness->base = (void *) HEAP_START; wilderness->base = (void *) HEAP_START;
wilderness->length = HEAP_LENGTH; wilderness->length = HEAP_LENGTH;
wilderness->next = 0;
vmm_addToQueue(VMM_HE_HOLE, wilderness); vmm_addToQueue(VMM_HE_HOLE, wilderness);
} }
@ -145,7 +145,14 @@ void *vmm_palloc()
{ {
k_enter_critical(); k_enter_critical();
HeapEntry_t *he = heapEntryQueues[VMM_HE_HOLE].start; 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(); k_leave_critical();
return NULL; return NULL;
@ -187,35 +194,35 @@ void vmm_addToQueue(u32_t queue, HeapEntry_t *he)
switch (queue) switch (queue)
{ {
HeapEntry_t *otherhe; HeapEntry_t *prevhe;
case VMM_HE_UNUSED: // don't sort at all, add to end case VMM_HE_UNUSED: // don't sort at all, add to end
otherhe = vmm_followChain(heapEntryQueues[queue].start); prevhe = vmm_followChain(heapEntryQueues[queue].start);
otherhe->next = he; prevhe->next = he;
heapEntryQueues[queue].count += vmm_countHeapEntries(he); heapEntryQueues[queue].count += vmm_countHeapEntries(he);
break; break;
case VMM_HE_USED: // sort by base address case VMM_HE_USED: // sort by base address
otherhe = heapEntryQueues[queue].start; prevhe = heapEntryQueues[queue].start;
while (otherhe->next) while (prevhe->next)
{ {
if (((HeapEntry_t *)otherhe->next)->base > he->base) if (((HeapEntry_t *)prevhe->next)->base > he->base)
break; break;
otherhe = otherhe->next; prevhe = prevhe->next;
} }
he->next = otherhe->next; he->next = prevhe->next;
otherhe->next = he; prevhe->next = he;
heapEntryQueues[queue].count++; heapEntryQueues[queue].count++;
break; break;
case VMM_HE_HOLE: // sort by length case VMM_HE_HOLE: // sort by length
case VMM_HE_FREE: case VMM_HE_FREE:
otherhe = heapEntryQueues[queue].start; prevhe = heapEntryQueues[queue].start;
while (otherhe->next) while (prevhe->next)
{ {
if (((HeapEntry_t *)otherhe->next)->length > he->length) if (((HeapEntry_t *)prevhe->next)->length > he->length)
break; break;
otherhe = otherhe->next; prevhe = prevhe->next;
} }
he->next = otherhe->next; he->next = prevhe->next;
otherhe->next = he; prevhe->next = he;
heapEntryQueues[queue].count++; heapEntryQueues[queue].count++;
break; break;
} }

View File

@ -24,7 +24,7 @@ typedef struct {
void *base; //virtual base address void *base; //virtual base address
u32_t length; //size in bytes u32_t length; //size in bytes
void *next; //link to next HeapEntry void *next; //link to next HeapEntry
u32_t padding; void *prev; //link to previous HeapEntry
} __attribute__((packed)) HeapEntry_t; } __attribute__((packed)) HeapEntry_t;
typedef struct { typedef struct {