diff --git a/src/sys/include/mm/vmm.h b/src/sys/include/mm/vmm.h index 37cbbf1..d2d9e90 100644 --- a/src/sys/include/mm/vmm.h +++ b/src/sys/include/mm/vmm.h @@ -8,8 +8,8 @@ struct _mMap { uInt32 pageAddr; /* same as physicalAddr for kernel */ - mMap *link; /* the next contiguous block */ uInt32 physicalAddr; + mMap *Link; /* the next contiguous block of memory */ mMap *First; mMap *Last; mMap *Next; diff --git a/src/sys/mm/getfreepage.c b/src/sys/mm/getfreepage.c index 0484076..3dbcf17 100644 --- a/src/sys/mm/getfreepage.c +++ b/src/sys/mm/getfreepage.c @@ -1,6 +1,9 @@ #include #include +mMap *mmFreePages; +mMap *mmUsedPages; + void * mmGetFreeVirtualPage(kTask_t *task) { @@ -8,14 +11,14 @@ /* remove the first free entry from the free pages list */ tmp = mmFreePages->First; - freePages--; mmFreePages->First = mmFreePages->First->Next; mmFreePages->First->Previous = NULL; /* add the free entry to the task's pages list */ - usedPages++; tmp->Next = NULL; tmp->Previous = task->LastPage; + + /* TODO: assign virtual addresses */ task->LastPage = tmp; return tmp; } diff --git a/src/sys/mm/kmalloc.c b/src/sys/mm/kmalloc.c index fc852d8..6e5508a 100644 --- a/src/sys/mm/kmalloc.c +++ b/src/sys/mm/kmalloc.c @@ -1,6 +1,30 @@ - +#include +#include +#include +#include void *kmalloc(size_t size) { + mMap *tmp, *tmp2; + double pages, p; + uInt32 retAddr; + if(size <= 0) + kpanic("kmalloc: trying to allocate zero sized page\n"); + + pages = size / 4096.0; + tmp2 = NULL; + + for(p = 1.0 ; p < pages ; p += 1.0) + { + if(tmp2 != NULL) + tmp->Link = (mMap *)tmp2; + tmp = (mMap *)mmGetFreeVirtualPage(_current); + if(tmp == NULL) + kpanic("kmalloc: out of memory\n"); + if(tmp2 == NULL) + retAddr = tmp->pageAddr; + tmp2 = tmp; + } + return retAddr; } diff --git a/src/sys/mm/memory.c b/src/sys/mm/memory.c index 80e8876..20fc134 100644 --- a/src/sys/mm/memory.c +++ b/src/sys/mm/memory.c @@ -7,7 +7,10 @@ #include #include -int numPages = 0; +int numPages = 0; +mMap *mmUsedPages; + +uInt32 countMemory(); void mmFreeTaskPages(kTask_t *task) @@ -15,15 +18,14 @@ /* just move the list to tail of the free page list */ if(task->FirstPage != NULL) { - vmmFreePages->Last->Next = task->FirstPage; - task->FirstPage->Previous = vmmFreePages->Last; - vmmFreePages->Last = task->LastPage; - memset(emptyKernDesc,0x0,0x4000); - /* TODO: zero out the memory last used */ + mmFreePages->Last->Next = task->FirstPage; + task->FirstPage->Previous = mmFreePages->Last; + mmFreePages->Last = task->LastPage; kprintf("mmFreeTaskPages: Memory has been wiped\n"); } else kprintf("mmFreeTaskPages: Nothing to free!\n"); + return; } void @@ -49,14 +51,14 @@ } /* add the page to the end free pages list */ - vmmFreePages->Last->Next = tmp; - tmp->Previous = vmmFreePages->Last; - vmmFreePages->Last = tmp; - kprintf("vmmFreeVirtualPage: %d has been freed\n", memAddr); + mmFreePages->Last->Next = tmp; + tmp->Previous = mmFreePages->Last; + mmFreePages->Last = tmp; + kprintf("mmFreeVirtualPage: %d has been freed\n", memAddr); return; } } - kpanic("vmmFreeVirtualPage: attempted to free non-existant page\n"); + kpanic("mmFreeVirtualPage: attempted to free non-existant page\n"); return; } @@ -65,16 +67,16 @@ { mMap *tmp; - if(vmmFreePages == NULL) + if(mmFreePages == NULL) { kprintf("Out of memory\n"); return NULL; } /* remove the first page from the list and return it */ - tmp = vmmFreePages->First; - vmmFreePages->First = vmmFreePages->First->Next; - vmmFreePages->First->Previous = NULL; + tmp = mmFreePages->First; + mmFreePages->First = mmFreePages->First->Next; + mmFreePages->First->Previous = NULL; return tmp; } @@ -94,54 +96,46 @@ /* initialize free pages */ for(z = memStart ; z < numPages; z++) { - if(vmmFreePages == NULL) + if(mmFreePages == NULL) { //UBU: replace this with static location - vmmFreePages = kmalloc(sizeof(mMap)); - vmmFreePages->First = vmmFreePages; - vmmFreePages->Last = vmmFreePages; - vmmFreePages->Next = NULL; - vmmFreePages->Previous = NULL; - vmmFreePages->pid = vmmID; - vmmFreePages->pageAddr = z * 4096; - vmmFreePages->status = memAvail; + mmFreePages = kmalloc(sizeof(mMap)); + mmFreePages->First = mmFreePages; + mmFreePages->Last = mmFreePages; + mmFreePages->Next = NULL; + mmFreePages->Previous = NULL; + mmFreePages->pageAddr = z * 4096; } else { //UBU: replace this with static location tmpMap = kmalloc(sizeof(mMap)); - vmmFreePages->Last->Next = tmpMap; - tmpMap->Previous = vmmFreePages->Last; - vmmFreePages->Last = tmpMap; - tmpMap->pid = vmmID; + mmFreePages->Last->Next = tmpMap; + tmpMap->Previous = mmFreePages->Last; + mmFreePages->Last = tmpMap; tmpMap->pageAddr = z * 4096; - tmpMap->status = memAvail; } } /* initialize used pages (kernel space) */ for(z = 0 ; z < memStart; z++) { - if(vmmUsedPages == NULL) + if(mmUsedPages == NULL) { - vmmUsedPages = kmalloc(sizeof(mMap)); - vmmUsedPages->First = vmmUsedPages; - vmmUsedPages->Last = vmmUsedPages; - vmmUsedPages->Next = NULL; - vmmUsedPages->Previous = NULL; - vmmUsedPages->pid = vmmID; - vmmUsedPages->pageAddr = z * 4096; - vmmUsedPages->status = memNotavail; + mmUsedPages = kmalloc(sizeof(mMap)); + mmUsedPages->First = mmUsedPages; + mmUsedPages->Last = mmUsedPages; + mmUsedPages->Next = NULL; + mmUsedPages->Previous = NULL; + mmUsedPages->pageAddr = z * 4096; } else { tmpMap = kmalloc(sizeof(mMap)); - vmmUsedPages->Last->Next = tmpMap; - tmpMap->Previous = vmmUsedPages->Last; - vmmUsedPages->Last = tmpMap; - tmpMap->pid = vmmID; + mmUsedPages->Last->Next = tmpMap; + tmpMap->Previous = mmUsedPages->Last; + mmUsedPages->Last = tmpMap; tmpMap->pageAddr = z * 4096; - tmpMap->status = memNotavail; } }