操作系统课程设计nachosProject2源代码Word文件下载.docx
- 文档编号:17622336
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:38
- 大小:28.21KB
操作系统课程设计nachosProject2源代码Word文件下载.docx
《操作系统课程设计nachosProject2源代码Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计nachosProject2源代码Word文件下载.docx(38页珍藏版)》请在冰豆网上搜索。
openfile[1]=UserKernel.console.openForWriting();
}
/**
*Allocateandreturnanewprocessofthecorrectclass.Theclassnameis
*specifiedbythe<
tt>
nachos.conf<
/tt>
key
*<
Kernel.processClassName<
.
*
*@returnanewprocessofthecorrectclass.
publicstaticUserProcessnewUserProcess(){//调用了上面的构造器创建一个进程
return(UserProcess)Lib.constructObject(Machine.getProcessClassName());
*Executethespecifiedprogramwiththespecifiedarguments.Attemptsto
*loadtheprogram,andthenforksathreadtorunit.
*@paramname
*thenameofthefilecontainingtheexecutable.
*@paramargs
*theargumentstopasstotheexecutable.
*@return<
true<
iftheprogramwassuccessfullyexecuted.
*用特定参数执行一个特定的线程,尝试加载程序,然后创建线程执行它
publicbooleanexecute(Stringname,String[]args){
if(!
load(name,args))
returnfalse;
//如果不能导入就返回false,程序执行失败
thread=newUThread(this);
//产生新的用户线程,并执行
thread.setName(name).fork();
returntrue;
*Loadtheexecutablewiththespecifiednameintothisprocess,and
*preparetopassitthespecifiedarguments.Openstheexecutable,reads
*itsheaderinformation,andcopiessectionsandargumentsintothis
*process'
svirtualmemory.
iftheexecutablewassuccessfullyloaded.
privatebooleanload(Stringname,String[]args){
Lib.debug(dbgProcess,"
UserProcess.load(\"
"
+name+"
\"
)"
);
//这里的filesystem实际是stubfilesystem的一个实例,executable也是一个StubOpenFile,里面有一个物理文件,可以随机访问
OpenFileexecutable=ThreadedKernel.fileSystem.open(name,false);
//如果文件系统存在就打开,否则返回null
if(executable==null){
Lib.debug(dbgProcess,"
\topenfailed"
//文件不存在时,无法加载,不能执行
}
try{
coff=newCoff(executable);
//用coff代表磁盘中的实际文件,导入虚拟内存时,从间接从物理磁盘导入
}catch(EOFExceptione){
executable.close();
\tcoffloadfailed"
numPages=0;
for(ints=0;
s<
coff.getNumSections();
s++){
CoffSectionsection=coff.getSection(s);
if(section.getFirstVPN()!
=numPages){
coff.close();
Lib.debug(dbgProcess,"
\tfragmentedexecutable"
returnfalse;
}
numPages+=section.getLength();
//得到section中所有页数
//确保argv数组的适合一页的长度
byte[][]argv=newbyte[args.length][];
intargsSize=0;
for(inti=0;
i<
args.length;
i++){
argv[i]=args[i].getBytes();
//4bytesforargv[]pointer;
thenstringplusonefornullbyte
argsSize+=4+argv[i].length+1;
//参数总长度,4是指针长度,1是空值
if(argsSize>
pageSize){
coff.close();
\targumentstoolong"
//programcounterinitiallypointsattheprogramentrypoint
initialPC=coff.getEntryPoint();
//nextcomesthestack;
stackpointerinitiallypointstotopofit
numPages+=stackPages;
//程序的页数还要加上堆栈的页数
initialSP=numPages*pageSize;
//andfinallyreserve1pageforarguments
numPages++;
//最后一页用来存放参数
loadSections())//把每一块导入
//storeargumentsinlastpage
//把参数存进最后一页
intentryOffset=(numPages-1)*pageSize;
intstringOffset=entryOffset+args.length*4;
this.argc=args.length;
this.argv=entryOffset;
argv.length;
byte[]stringOffsetBytes=Lib.bytesFromInt(stringOffset);
Lib.assertTrue(writeVirtualMemory(entryOffset,stringOffsetBytes)==4);
entryOffset+=4;
Lib.assertTrue(writeVirtualMemory(stringOffset,argv[i])==argv[i].length);
stringOffset+=argv[i].length;
Lib.assertTrue(writeVirtualMemory(stringOffset,newbyte[]{0})==1);
stringOffset+=1;
*Allocatesmemoryforthisprocess,andloadstheCOFFsectionsinto
*memory.Ifthisreturnssuccessfully,theprocesswilldefinitelyberun
*(thisisthelaststepinprocessinitializationthatcanfail).
ifthesectionsweresuccessfullyloaded.
*为这个进程分配内存,将coff块导入进内存,如果成功,进程就会执行(这是进程初始化会失败的最后一步)
protectedbooleanloadSections(){
UserKernel.allocateMemoryLock.acquire();
//获得锁,确保内存分配时原子性的
if(numPages>
UserKernel.memoryLinkedList.size()){//如果程序的页数大于处理器的空闲物理页数,就会失败
\tinsufficientphysicalmemory"
UserKernel.allocateMemoryLock.release();
pageTable=newTranslationEntry[numPages];
//创建页表
for(inti=0;
numPages;
i++)
{
intnextPage=UserKernel.memoryLinkedList.remove();
//将要分配的页从空闲内存链表中取出
pageTable[i]=newTranslationEntry(i,nextPage,true,false,false,false);
//虚拟页号,实际页号,是否有效,是否只读,是否使用,脏位
UserKernel.allocateMemoryLock.release();
//内存分配完毕,释放锁
//将每一块导入
for(ints=0;
CoffSectionsection=coff.getSection(s);
\tinitializing"
+section.getName()
+"
section("
+section.getLength()+"
pages)"
for(inti=0;
section.getLength();
intvpn=section.getFirstVPN()+i;
//得到虚拟页号
pageTable[vpn].readOnly=section.isReadOnly();
section.loadPage(i,pageTable[vpn].ppn);
//将每一部分的每一页导入到内存中,i是段内的序号,ppn是内存实际序号
}
returntrue;
*Savethestateofthisprocessinpreparationforacontextswitch.
*Calledby<
UThread.saveState()<
publicvoidsaveState(){
*Restorethestateofthisprocessafteracontextswitch.Calledby
UThread.restoreState()<
publicvoidrestoreState(){
Machine.processor().setPageTable(pageTable);
//将处理器的页表置为这个线程的页表
*Readanull-terminatedstringfromthisprocess'
svirtualmemory.Readat
*most<
maxLength+1<
bytesfromthespecifiedaddress,searchfor
*thenullterminator,andconvertittoa<
java.lang.String<
*withoutincludingthenullterminator.Ifnonullterminatorisfound,
*returns<
null<
*@paramvaddr
*thestartingvirtualaddressofthenull-terminatedstring.
*@parammaxLength
*themaximumnumberofcharactersinthestring,notincluding
*thenullterminator.
*@returnthestringread,or<
ifnonullterminatorwas
*found.
*从这个进程的虚拟内存中读一个null结尾的字符串。
从特定的地址读最多maxlength+1长度的字符。
搜索null
*终止符,包括这个终止符把它转化为String类型,如果没有终止符,返回null
publicStringreadVirtualMemoryString(intvaddr,intmaxLength){//从虚拟内存读字符串
Lib.assertTrue(maxLength>
=0);
byte[]bytes=newbyte[maxLength+1];
intbytesRead=readVirtualMemory(vaddr,bytes);
for(intlength=0;
length<
bytesRead;
length++){
if(bytes[length]==0)
returnnewString(bytes,0,length);
returnnull;
*Transferdatafromthisprocess'
svirtualmemorytoallofthespecified
*array.Sameas<
readVirtualMemory(vaddr,data,0,data.length)<
*thefirstbyteofvirtualmemorytoread.
*@paramdata
*thearraywherethedatawillbestored.
*@returnthenumberofbytessuccessfullytransferred.
publicintreadVirtualMemory(intvaddr,byte[]data){//将指定虚拟地址的数据从内存中读出,放入字符数组中
returnreadVirtualMemory(vaddr,data,0,data.length);
svirtualmemorytothespecifiedarray.
*Thismethodhandlesaddresstranslationdetails.Thismethodmust
i>
not<
/i>
destroythecurrentprocessifanerroroccurs,butinstead
*shouldreturnthenumberofbytessuccessfullycopied(orzeroifnodata
*couldbecopied).
*@paramoffset
*thefirstbytetowriteinthearray.
*@paramlength
*thenumberofbytestotransferfromvirtualmemorytothe
*array.
*从进程的虚拟内存中将数据转化为特定的数组。
这个方法处理地址转换的细节。
这个方法在发生错误时必须不能
*损坏当前进程,但是应该返回成功复制的字节的数量,如果没有数据复制返回0
publicintreadVirtualMemory(intvaddr,byte[]data,intoffset,intlength)
{
Lib.assertTrue(offset>
=0&
&
length>
=0
&
offset+length<
=data.length);
byte[]memory=Machine.processor().getMemory();
if(length>
(pageSize*numPages-vaddr))
length=pageSize*numPages-vaddr;
//读出的长度超过了文件的长度,只能读出从虚拟地址到结尾的内容
if(data.length-offset<
length)
length=data.length-offset;
//读出长度超过了数组的长度,只能读出从指针到结尾的长度
inttransferredbyte=0;
//已转换的字符数
do{
intpageNum=Processor.pageFromAddress(vaddr+transferredbyte);
//得到页号
if(pageNum<
0||pageNum>
=pageTable.length)//判断页号的合法性
return0;
intpageOffset=Processor.offsetFromAddress(vaddr+transferredbyte);
//得到在页中的索引
intleftByte=pageSize-pageOffset;
//这一页剩下的字符数量
intamount=Math.min(leftByte,leng
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 nachosProject2 源代码
![提示](https://static.bdocx.com/images/bang_tan.gif)