diff --git a/src/sys/mm/Makefile b/src/sys/mm/Makefile index b14b74f..009064b 100644 --- a/src/sys/mm/Makefile +++ b/src/sys/mm/Makefile @@ -6,7 +6,7 @@ include ../Makefile.inc # Objects -OBJS = page_fault.o pagefault.o copyvirtualspace.o getfreepage.o memory.o kmalloc.o kfree.o vmminit.o +OBJS = page_fault.o pagefault.o copyvirtualspace.o memory.o kmalloc.o kfree.o vmminit.o setpageattributes.o all: $(OBJS) diff --git a/src/sys/mm/kfree.c b/src/sys/mm/kfree.c index 6f0e107..47195df 100644 --- a/src/sys/mm/kfree.c +++ b/src/sys/mm/kfree.c @@ -2,6 +2,8 @@ void kfree(void *ptr) { + kprintf("trying to free.\n"); mmFreeVirtualPage(_current, (uInt32)&(ptr)); + kprintf("Freed\n"); return; } diff --git a/src/sys/mm/kmalloc.c b/src/sys/mm/kmalloc.c index 2382e40..e6f7052 100644 --- a/src/sys/mm/kmalloc.c +++ b/src/sys/mm/kmalloc.c @@ -15,16 +15,19 @@ pages = size / 4096.0; tmp2 = NULL; + kprintf("Trying to allocate [%d] pages\n", pages); + for(p = 1.0 ; p < pages ; p += 1.0) { if(tmp2 != NULL) - tmp->Link = (mMap *)tmp2; + tmp->Link = tmp2; tmp = (mMap *)mmGetFreeVirtualPage(_current); if(tmp == NULL) kpanic("kmalloc: out of memory\n"); if(tmp2 == NULL) retAddr = tmp->pageAddr; tmp2 = tmp; + kprintf("retAddr = {%x} {%x} {%x}\n", retAddr, tmp->pageAddr, tmp->physicalAddr); } return (void *)retAddr; } diff --git a/src/sys/mm/memory.c b/src/sys/mm/memory.c index c560f93..c06b708 100644 --- a/src/sys/mm/memory.c +++ b/src/sys/mm/memory.c @@ -14,22 +14,7 @@ uInt32 z = 0, memStart = 0; uInt32 countMemory(); -void -mmFreeTaskPages(kTask_t *task) -{ - /* just move the list to tail of the free page list */ - if(task->FirstPage != NULL) - { - 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; -} - +kTask_t *SYSTEM = 0xFC000000; void mmFreeVirtualPage(kTask_t *task, uInt32 memAddr) @@ -83,34 +68,45 @@ mmGetFreeVirtualPage(kTask_t *task) { mMap *tmp, *tmpMap; - z++; freePages--; - kprintf("%d:%d - [%x]\n", z, numPages, tmpMap->pageAddr); + kprintf("Z = %d + sizeof %d = %d", z, sizeof(mMap), z + sizeof(mMap)); if(mmFreePages == NULL) { - mmFreePages = (mMap *)(z * 4096); + kprintf("1\n"); + mmFreePages = (z + sizeof(mMap)); mmFreePages->First = mmFreePages; mmFreePages->Last = mmFreePages; mmFreePages->Next = NULL; mmFreePages->Previous = NULL; mmFreePages->pageAddr = z * 4096; mmFreePages->physicalAddr = z * 4096; + kprintf("something goes wrong here"); + + } else { - tmpMap = (mMap *)(z * 4096); - mmFreePages->Last->Next = tmpMap; + kprintf("2\n"); + tmpMap = (z + sizeof(mMap)); + tmp = mmFreePages->Last; + tmp->Next = tmpMap; tmpMap->Previous = mmFreePages->Last; mmFreePages->Last = tmpMap; tmpMap->pageAddr = z * 4096; tmpMap->physicalAddr = z * 4096; + kprintf("something goes wrong here"); } - + z+=sizeof(mMap)+1; // remove the first page from the list and return it // tmp = mmFreePages->First; + kprintf("3\n"); + mmFreePages->First = mmFreePages->First->Next; mmFreePages->First->Previous = NULL; + + kprintf("%d:%d - [0x%X] - [0x%X]\n", z, numPages, tmpMap->pageAddr, tmp); + return tmp; } @@ -120,45 +116,22 @@ uInt32 memStart; mMap *tmpMap; + _current = SYSTEM; /* Count System Memory */ numPages = countMemory(); freePages = numPages; - /* calculate the start of memory */ - memStart = 0x101; - memStart += (((sizeof(mMap) * numPages) + (sizeof(mMap) - 1)) / 0x1000); + +// memStart = sizeof(mMap) * numPages; /* initialize free pages */ - kprintf("Initializing memory memStart = [%x]\n", memStart); + //kprintf("Initializing memory memStart = [%x]\n", memStart); /* initialize used pages (kernel space) */ - for(z = 0 ; z < memStart; z++) - { - if(mmUsedPages == NULL) - { - mmUsedPages = (mMap *)(z * 4096); - mmUsedPages->First = mmUsedPages; - mmUsedPages->Last = mmUsedPages; - mmUsedPages->Next = NULL; - mmUsedPages->Previous = NULL; - mmUsedPages->pageAddr = z * 4096; - mmUsedPages->physicalAddr = z * 4096; - } - else - { - mmUsedPages = (mMap *)(z * 4096); - mmUsedPages->Last->Next = tmpMap; - tmpMap->Previous = mmUsedPages->Last; - mmUsedPages->Last = tmpMap; - tmpMap->pageAddr = z * 4096; - tmpMap->physicalAddr = z * 4096; - } - freePages--; - usedPages++; - } - z++; + + z = 0xFFFF0000; /* Print Out Memory Information */ - kprintf("Real Memory: %iMB\n", ((numPages * 4096) / 1024) / 1024 ); - kprintf("Available Memory: %iMB\n", ((freePages * 4096) / 1024) / 1024 ); - kprintf("Used Memory: %iMB\n", ((usedPages * 4096) / 1024) / 1024 ); + kprintf("Total Memory: %iMB\n", ((numPages * 4096) / 1024) / 1024 ); + //kprintf("Available Memory: %iMB\n", ((freePages * 4096) / 1024) / 1024 ); + //kprintf("Used Memory: %iMB\n", ((usedPages * 4096) / 1024) / 1024 ); /* Return */ return (0); diff --git a/src/sys/mm/pagefault.c b/src/sys/mm/pagefault.c index 4904137..d795baa 100644 --- a/src/sys/mm/pagefault.c +++ b/src/sys/mm/pagefault.c @@ -10,6 +10,8 @@ kTask_t *tmp = _current; mMap *m = tmp->FirstPage; + kprintf("Page fault! woop\n"); + for( ; m != NULL ; m = m->Next) { if(m->pageAddr == memAddr) diff --git a/src/sys/sys/idt.c b/src/sys/sys/idt.c index 428756b..065f75d 100644 --- a/src/sys/sys/idt.c +++ b/src/sys/sys/idt.c @@ -228,14 +228,14 @@ } void _int6() { - kpanic("int6: Invalid opcode! [%i]\n",_current->id); + kpanic("int6: Invalid opcode! [%x]\n",_current->tss.eip); endTask(_current->id); sched_yield(); } void _int8() { struct tssStruct *sfTSS = (struct tssStruct *)0x6200; - kprintf("int8: Double Fault! [%i]\n",_current->id); + kprintf("int8: Double Fault! [%x]\n",_current->tss.eip); /* sfTSS->cr3 = (unsigned int)kernelPageDirectory;