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 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;
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user