diff --git a/src/kernel/vm2/area.C b/src/kernel/vm2/area.C index 9212a3c9cc..49938ff37a 100644 --- a/src/kernel/vm2/area.C +++ b/src/kernel/vm2/area.C @@ -117,7 +117,7 @@ bool area::contains(void *address) { // no need to lock here... unsigned long base=(unsigned long)(address); - printf ("area::contains: looking for %d in %d -- %d, value = %d\n",base,start_address,end_address, ((start_address<=base) && (end_address>=base))); +// printf ("area::contains: looking for %d in %d -- %d, value = %d\n",base,start_address,end_address, ((start_address<=base) && (end_address>=base))); return ((start_address<=base) && (end_address>=base)); } diff --git a/src/kernel/vm2/areaManager.C b/src/kernel/vm2/areaManager.C index b4bcd3b02b..94bc4ae6ec 100644 --- a/src/kernel/vm2/areaManager.C +++ b/src/kernel/vm2/areaManager.C @@ -40,7 +40,7 @@ area *areaManager::findArea(void *address) for (struct node *cur=areas.rock;cur;cur=cur->next) { area *myArea=(area *)cur; - printf ("areaManager::findArea: Looking for %d\n",address); + // printf ("areaManager::findArea: Looking for %d\n",address); if (myArea->contains(address)) return myArea; } diff --git a/src/kernel/vm2/list.h b/src/kernel/vm2/list.h index 09fddbeb7d..84fcf3cfd3 100644 --- a/src/kernel/vm2/list.h +++ b/src/kernel/vm2/list.h @@ -19,7 +19,8 @@ class list { rock=newNode; nodeCount++; } - int count(void) {printf ("list::count: About to return %d\n",nodeCount);return nodeCount;} + //int count(void) {printf ("list::count: About to return %d\n",nodeCount);return nodeCount;} + int count(void) {return nodeCount;} void *next(void) {nodeCount--;node *n=rock;if (rock) rock=rock->next;return n;} void remove(void *in) { diff --git a/src/kernel/vm2/pageManager.C b/src/kernel/vm2/pageManager.C index 353c18cde8..c101d67873 100644 --- a/src/kernel/vm2/pageManager.C +++ b/src/kernel/vm2/pageManager.C @@ -22,10 +22,12 @@ pageManager::pageManager(int pages) unusedLock=create_sem (1,"unused_lock"); inUseLock=create_sem (1,"inuse_lock"); totalPages=pages; + /* printf ("pageManager::pageManager: About to dump the clean pages (should be 0):\n\n"); clean.dump(); printf ("pageManager::pageManager: About to dump the unused pages (should not be 0):\n\n"); unused.dump(); + */ } page *pageManager::getPage(void) @@ -75,16 +77,21 @@ void pageManager::freePage(page *toFree) void pageManager::cleaner(void) { - if (unused.count()) + while (1) { - acquire_sem(unusedLock); - page *first=(page *)unused.next(); - first->zero(); - acquire_sem(cleanLock); - clean.add(first); - release_sem(cleanLock); - release_sem(unusedLock); - snooze(250000); + if (unused.count()) + { + printf ("pageManager::cleaner: About to vacuum a page\n"); + acquire_sem(unusedLock); + page *first=(page *)unused.next(); + first->zero(); + acquire_sem(cleanLock); + clean.add(first); + release_sem(cleanLock); + release_sem(unusedLock); + printf ("pageManager::cleaner: All done with vacuum a page\n"); + snooze(125000); + } } } diff --git a/src/kernel/vm2/swapFileManager.C b/src/kernel/vm2/swapFileManager.C index eb5f47d3a4..b32da4800f 100644 --- a/src/kernel/vm2/swapFileManager.C +++ b/src/kernel/vm2/swapFileManager.C @@ -1,9 +1,13 @@ #include "swapFileManager.h" #include +#include +#include swapFileManager::swapFileManager(void) { - swapFile = open("/boot/var/tmp/OBOS_swap",O_RDWR ); + swapFile = open("/boot/var/tmp/OBOS_swap",O_RDWR|O_CREAT,0x777 ); + if (swapFile==-1) + printf ("swapfileManager::swapFileManger: swapfile not opened, errno = %ul, %s\n",errno,strerror(errno)); } void swapFileManager::write_block(vnode node,void *loc,unsigned long size) @@ -16,10 +20,10 @@ void swapFileManager::write_block(vnode node,void *loc,unsigned long size) void swapFileManager::read_block(vnode node,void *loc,unsigned long size) { - printf ("swapFileManager::read_block: reading, node.fd = %d, node.offset = %d\n",node.fd, node.offset); lseek(node.fd,SEEK_SET,node.offset); if (node.valid==false) return; // Do nothing. This prevents "garbage" data on disk from being read in... + printf ("swapFileManager::read_block: reading, node.fd = %d, node.offset = %d\n",node.fd, node.offset); read(node.fd,loc,size); } diff --git a/src/kernel/vm2/test.C b/src/kernel/vm2/test.C index 6e86f3d9ba..7139567ad7 100644 --- a/src/kernel/vm2/test.C +++ b/src/kernel/vm2/test.C @@ -1,19 +1,49 @@ #include "vmInterface.h" #include +unsigned long addr; +vmInterface vm(10); + +void writeByte(unsigned int offset, char value) +{ + //printf ("writeByte: writing %d to offset %d\n",value,offset); + vm.setByte(addr+offset,value); +} + +unsigned char readByte(unsigned int offset ) +{ + char value=vm.getByte(addr+offset); + //printf ("readByte: read %d from offset %d\n",value,offset); + return value; +} + int main(int argc,char **argv) { - vmInterface vm(10); - - unsigned long addr; vm.createArea("Mine",2,(void **)(&addr)); - printf ("addr = %d\n",addr); - vm.setByte(addr,99); - printf ("addr = %d\n",addr); - printf ("Byte = %d\n",vm.getByte(addr)); + writeByte(0,99); + readByte(0); printf ("\n\n\n\n\n"); - vm.setByte(addr+4097,99); - printf ("addr = %d\n",addr); - printf ("Byte = %d\n",vm.getByte(addr)); + writeByte(4097,99); + readByte(4097); + printf ("\n\n\n\n\n"); + for (int i=0;i<8192;i++) + writeByte(i,i%256); + for (int i=0;i<8192;i++) + if (i%256!=readByte(i)) + printf ("ERROR! Byte at offset %d does not match: expected: %d, found: %d\n",i,i%256,readByte(i)); + snooze(10000000); + vm.createArea("Mine",2,(void **)(&addr)); + writeByte(0,99); + readByte(0); + printf ("\n\n\n\n\n"); + writeByte(4097,99); + readByte(4097); + printf ("\n\n\n\n\n"); + for (int i=0;i<8192;i++) + writeByte(i,i%256); + for (int i=0;i<8192;i++) + if (i%256!=readByte(i)) + printf ("ERROR! Byte at offset %d does not match: expected: %d, found: %d\n",i,i%256,readByte(i)); + return 0; } diff --git a/src/kernel/vm2/vmInterface.C b/src/kernel/vm2/vmInterface.C index e55bd1d61f..0bd1e32122 100644 --- a/src/kernel/vm2/vmInterface.C +++ b/src/kernel/vm2/vmInterface.C @@ -6,6 +6,19 @@ areaManager am; swapFileManager swapMan; pageManager pageMan(10); // Obviously this hard coded number is a hack... +int32 cleanerThread(void *pageMan) + { + pageManager *pm=(pageManager *)pageMan; + pm->cleaner(); + return 0; + } + +vmInterface::vmInterface(int pages) + { + nextAreaID=0; + resume_thread(spawn_thread(cleanerThread,"cleanerThread",0,&pageMan)); + } + areaManager *vmInterface::getAM(void) { // Normally, we would go to the current user process to get this. Since there no such thing exists here... @@ -83,8 +96,8 @@ void vmInterface::pager(void) // This should iterate over all processes... while (1) { - am.pager(pageMan.desperation()); snooze(250000); + am.pager(pageMan.desperation()); } } @@ -93,8 +106,8 @@ void vmInterface::saver(void) // This should iterate over all processes... while (1) { - am.saver(); snooze(250000); + am.saver(); } } diff --git a/src/kernel/vm2/vmInterface.h b/src/kernel/vm2/vmInterface.h index b8b212c6d1..feb896495f 100644 --- a/src/kernel/vm2/vmInterface.h +++ b/src/kernel/vm2/vmInterface.h @@ -8,7 +8,7 @@ class vmInterface // This is the class that "owns" all of the managers. int nextAreaID; areaManager *getAM(void); // This is for testing only... public: - vmInterface(int pages) {nextAreaID=0;}; + vmInterface(int pages); int createArea(char *AreaName,int pageCount,void **address, addressSpec addType=ANY, pageState state=NO_LOCK,protectType protect=writable); diff --git a/src/kernel/vm2/vpage.C b/src/kernel/vm2/vpage.C index 3af4e73688..656e6aff91 100644 --- a/src/kernel/vm2/vpage.C +++ b/src/kernel/vm2/vpage.C @@ -76,20 +76,20 @@ bool vpage::fault(void *fault_address, bool writeError) // true = OK, false = pa char vpage::getByte(unsigned long address) { - printf ("vpage::getByte: address = %d\n",address ); +// printf ("vpage::getByte: address = %d\n",address ); if (!physPage) fault((void *)(address),false); - printf ("vpage::getByte: About to return %d\n", *((char *)(address-start_address+physPage->getAddress()))); +// printf ("vpage::getByte: About to return %d\n", *((char *)(address-start_address+physPage->getAddress()))); return *((char *)(address-start_address+physPage->getAddress())); } void vpage::setByte(unsigned long address,char value) { - printf ("vpage::setByte: address = %d, value = %d\n",address, value); +// printf ("vpage::setByte: address = %d, value = %d\n",address, value); if (!physPage) fault((void *)(address),true); *((char *)(address-start_address+physPage->getAddress()))=value; - printf ("vpage::setByte: physical address = %d, value = %d\n",physPage->getAddress(), *((char *)(physPage->getAddress()))); +// printf ("vpage::setByte: physical address = %d, value = %d\n",physPage->getAddress(), *((char *)(physPage->getAddress()))); } int vpage::getInt(unsigned long address)