diff --git a/code/Makefile.common b/code/Makefile.common index 971481c..5ce9ce9 100644 --- a/code/Makefile.common +++ b/code/Makefile.common @@ -32,7 +32,7 @@ THREAD_O := main.o list.o scheduler.o synch.o synchlist.o \ USERPROG_O := addrspace.o bitmap.o exception.o progtest.o console.o \ consoledriver.o machine.o mipssim.o translate.o \ - userthread.o papeprovider.o + userthread.o pageprovider.o VM_O := diff --git a/code/machine/machine.cc b/code/machine/machine.cc index 2ab5d32..af290ec 100644 --- a/code/machine/machine.cc +++ b/code/machine/machine.cc @@ -61,7 +61,7 @@ Machine::Machine(bool debug) mainMemory = new char[MemorySize]; for (i = 0; i < MemorySize; i++) mainMemory[i] = 0; - #ifdef USE_TLB +#ifdef USE_TLB tlb = new TranslationEntry[TLBSize]; for (i = 0; i < TLBSize; i++) tlb[i].valid = FALSE; diff --git a/code/test/userpages0 b/code/test/userpages0 index cb8cc90..b624377 100644 Binary files a/code/test/userpages0 and b/code/test/userpages0 differ diff --git a/code/userprog/addrspace.cc b/code/userprog/addrspace.cc index 7eca092..7aed644 100644 --- a/code/userprog/addrspace.cc +++ b/code/userprog/addrspace.cc @@ -99,8 +99,13 @@ AddrSpace::AddrSpace (OpenFile * executable) pageTable = new TranslationEntry[numPages]; for (i = 0; i < numPages; i++) { - pageTable[i].physicalPage = i; // for now, phys page # = virtual page # - pageTable[i].valid = TRUE; + // pageTable[i].physicalPage = i; // for now, phys page # = virtual page # + #ifdef CHANGED + int newPage = pageProvider->GetEmptyPage(); + ASSERT(newPage != -1); + pageTable[i].physicalPage = newPage; + #endif + pageTable[i].valid = TRUE; pageTable[i].use = FALSE; pageTable[i].dirty = FALSE; pageTable[i].readOnly = FALSE; // if the code segment was entirely on diff --git a/code/userprog/pageprovider.cc b/code/userprog/pageprovider.cc index 0a75e96..7bbead7 100644 --- a/code/userprog/pageprovider.cc +++ b/code/userprog/pageprovider.cc @@ -4,6 +4,7 @@ #include "system.h" PageProvider::PageProvider(int n) { + DEBUG ('x', "PageProvider constructor, pages: %i\n", n); page = new BitMap(n); page->Mark(0); } @@ -13,12 +14,13 @@ PageProvider::~PageProvider(){ } int PageProvider::GetEmptyPage() { - int page = page->Find(); - if(emptyPage != -1) + DEBUG ('x', "GetEmptyPage()\n"); + int newPage = page->Find(); + if(newPage == -1) return -1; - memset(machine->mainMemory+emptyPage * PageSize, 0, PageSize); - DEBUG ('a', "Allocated page: %i\n", page); - return page; + memset(machine->mainMemory+newPage * PageSize, 0, PageSize); + DEBUG ('x', "PageProvider: Allocated page: %i\n", newPage); + return newPage; } void PageProvider::ReleasePage(int n) {