From f7eca8c6aceae3851f019eb3a308247cf291d353 Mon Sep 17 00:00:00 2001 From: Yorick Barbanneau Date: Tue, 7 Dec 2021 23:54:07 +0100 Subject: [PATCH] TD3:I6 Use PageProvider in AddrSpace First Working version, need better error handling --- code/Makefile.common | 2 +- code/machine/machine.cc | 2 +- code/test/userpages0 | Bin 808 -> 808 bytes code/userprog/addrspace.cc | 9 +++++++-- code/userprog/pageprovider.cc | 12 +++++++----- 5 files changed, 16 insertions(+), 9 deletions(-) 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 cb8cc90ba1dc995a0edaf39c7ecec64cf638f5c7..b6243774929b274e918c76bbd09bf73cdf608b9e 100644 GIT binary patch delta 21 ccmZ3%wt{WL2`0|m#LPSmO@++7$;X+(0aOtOfB*mh delta 14 WcmZ3%wt{WL38u-Hn8GGHZ~*`;HU)10 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) {