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 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;
}

View File

@ -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 {