From a114fc9a743524391fe0af0fd5f33139e91a8cd2 Mon Sep 17 00:00:00 2001 From: ginger88895 Date: Thu, 2 May 2019 22:06:31 +0800 Subject: [PATCH] Finished all parts --- proj2/nachos/userprog/UserProcess.class | Bin 12056 -> 12216 bytes userprog/UserProcess.java | 58 ++++++++++++------------ 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/proj2/nachos/userprog/UserProcess.class b/proj2/nachos/userprog/UserProcess.class index 86d2f3e234e8bc6fcb55f7ce440ff9da26085c99..63c5cba7179174ef6d7d55249529d624fed39779 100644 GIT binary patch delta 6078 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 diff --git a/userprog/UserProcess.java b/userprog/UserProcess.java index 756acff..7580411 100644 --- a/userprog/UserProcess.java +++ b/userprog/UserProcess.java @@ -158,12 +158,8 @@ public class UserProcess { */ public int readVirtualMemory(int vaddr, byte[] data, int offset, int length) { - //TODO: Boundary checks - //Lib.assertTrue(offset >= 0 && length >= 0 && offset+length <= data.length); - byte[] memory = Machine.processor().getMemory(); - - // for now, just assume that virtual addresses equal physical addresses + int vpn=vaddr/pageSize; if(vaddr<0||vpn>=numPages) return 0; @@ -176,7 +172,6 @@ public class UserProcess { if(amount<=0) break; System.arraycopy(memory,pageTable[i].ppn*pageSize+ppn_offs,data,offset,amount); - //System.arraycopy(data,offset,memory,vaddr,amount); offset+=amount; vaddr+=amount; length-=amount; @@ -214,16 +209,8 @@ public class UserProcess { */ public int writeVirtualMemory(int vaddr, byte[] data, int offset, int length) { - //TODO: Boundary checks - //Lib.assertTrue(offset >= 0 && length >= 0 && offset+length <= data.length); - byte[] memory = Machine.processor().getMemory(); - // for now, just assume that virtual addresses equal physical addresses - /* - if (vaddr < 0 || vaddr >= memory.length) - return 0; - */ int vpn=vaddr/pageSize; if(vaddr<0||vpn>=numPages) return 0; @@ -463,6 +450,13 @@ public class UserProcess { return 0; } + private byte[] bytearray_create_safe(int size) + { + if(size<0||size>numPages*pageSize) + return null; + return new byte[size]; + } + /** * Handle a syscall exception. Called by handleException(). The * syscall argument identifies which syscall the user executed: @@ -493,8 +487,6 @@ public class UserProcess { */ public int handleSyscall(int syscall, int a0, int a1, int a2, int a3) { - //TODO: Bullet-proof? - //System.out.println("System Call: "+syscall); String fn; String[] argz; byte[] buf; @@ -513,9 +505,11 @@ public class UserProcess { fn=readVirtualMemoryString(a0,256); if(fn!=null&&fn.lastIndexOf('.')!=-1&&fn.substring(fn.lastIndexOf('.')).equals(".coff")) { - buf=new byte[8*a1]; + buf=bytearray_create_safe(4*a1); + if(buf==null) + return -1; argz=new String[a1]; - readVirtualMemory(a2,buf,0,8*a1); + readVirtualMemory(a2,buf,0,4*a1); tmp=0; for(int i=0;i<4*a1;i++) { @@ -523,6 +517,8 @@ public class UserProcess { if(i%4==3) { argz[i/4]=readVirtualMemoryString(tmp,256); + if(argz[i/4]==null) + argz[i/4]=new String(); tmp=0; } } @@ -537,7 +533,6 @@ public class UserProcess { } return -1; } - System.out.println("Bloody hell"); return -1; case syscallJoin: @@ -550,7 +545,6 @@ public class UserProcess { tmp=UserKernel.process_fin.get(a0); if(tmp==1) { - //Already finished val=UserKernel.process_return.get(a0); UserKernel.process_lock.V(); } @@ -580,11 +574,10 @@ public class UserProcess { fn=readVirtualMemoryString(a0,256); if(fn!=null) { - //System.out.println("I am going to create a file name "+fn); OpenFile tf=ThreadedKernel.fileSystem.open(fn,true); if(tf==null) return -1; - for(int i=2;i<16;i++) + for(int i=0;i<16;i++) if(descs[i]==null) { descs[i]=tf; @@ -592,14 +585,12 @@ public class UserProcess { } return -1; } - System.out.println("Bloody hell"); return -1; case syscallOpen: fn=readVirtualMemoryString(a0,256); if(fn!=null) { - //System.out.println("I am going to open a file name "+fn); OpenFile tf=ThreadedKernel.fileSystem.open(fn,false); if(tf==null) return -1; @@ -611,28 +602,35 @@ public class UserProcess { } return -1; } - System.out.println("Bloody hell"); return -1; case syscallRead: + if(a0<0||a0>=16) + return -1; if(descs[a0]==null) return -1; - buf=new byte[a2]; + buf=bytearray_create_safe(a2); + if(buf==null) + return -1; len=descs[a0].read(buf,0,a2); if(len<0) return -1; return writeVirtualMemory(a1,buf,0,len); case syscallWrite: + if(a0<0||a0>=16) + return -1; if(descs[a0]==null) return -1; - buf=new byte[a2]; + buf=bytearray_create_safe(a2); + if(buf==null) + return -1; len=readVirtualMemory(a1,buf,0,a2); - //return descs[a0].write(buf,0,len); - len=descs[a0].write(buf,0,len); - return len; + return descs[a0].write(buf,0,len); case syscallClose: + if(a0<0||a0>=16) + return -1; if(descs[a0]!=null) descs[a0].close(); descs[a0]=null;