Import backup from 2004-07-25
This commit is contained in:
parent
1063a68a21
commit
11da8cb162
@ -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;
|
||||
}
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user