您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > nachos代码阅读--xq
1.宏总结:/threads/thread.h#defineMachineStateSize18#defineStackSize(4*1024)/threads/thread.cc#defineSTACK_FENCEPOST0xdeadbeef/userprog/addrspace.h#defineUserStackSize1024/userprog/bitmap.h#defineBitsInByte8#defineBitsInWord32/userprog/syscall.h#defineSC_Halt0#defineSC_Exit1#defineSC_Exec2#defineSC_Join3#defineSC_Create4#defineSC_Open5#defineSC_Read6#defineSC_Write7#defineSC_Close8#defineSC_Fork9#defineSC_Yield10#defineConsoleInput0#defineConsoleOutput1/machine/disk.h#defineSectorSize128//numberofbytesperdisksector#defineSectorsPerTrack32//numberofsectorsperdisktrack#defineNumTracks32//numberoftracksperdisk#defineNumSectors(SectorsPerTrack*NumTracks)//total#ofsectorsperdisk/machine/disk.cc#defineMagicNumber0x456789ab#defineMagicSizesizeof(int)#defineDiskSize(MagicSize+(NumSectors*SectorSize))/machine/machine.h#definePageSizeSectorSize//setthepagesizeequaltothedisksectorsize,forsimplicity#defineNumPhysPages32#defineMemorySize(NumPhysPages*PageSize)#defineStackReg29//User'sstackpointer#defineRetAddrReg31//Holdsreturnaddressforprocedurecalls#defineNumGPRegs32//32generalpurposeregistersonMIPS#defineHiReg32//Doubleregistertoholdmultiplyresult#defineLoReg33#definePCReg34//Currentprogramcounter#defineNextPCReg35//Nextprogramcounter(forbranchdelay)#definePrevPCReg36//Previousprogramcounter(fordebugging)#defineLoadReg37//Theregistertargetofadelayedload.#defineLoadValueReg38//Thevaluetobeloadedbyadelayedload.#defineBadVAddrReg39//Thefailingvirtualaddressonanexception#defineNumTotalRegs40/machine/mipssim.h#defineOP_????/filesys/directory.h#defineFileNameMaxLen9//forsimplicity,weassumefilenamesare=9characterslong/filesys/filehdr.h#defineNumDirect((SectorSize-2*sizeof(int))/sizeof(int))#defineMaxFileSize(NumDirect*SectorSize)/filesys/filesys.cc#defineFreeMapSector0#defineDirectorySector1#defineFreeMapFileSize(NumSectors/BitsInByte)#defineNumDirEntries10#defineDirectoryFileSize(sizeof(DirectoryEntry)*NumDirEntries)#defineTransferSize10//makeitsmall,justtobedifficult/filesys/fstest.cc#defineTransferSize10//makeitsmall,justtobedifficult2./nachos-3.4/code/A.Makefile.dep:GNU-Makefile的一部分,指定了Makefile系统环境中相互依赖的部分,还指定了平台,此处为Linux;#also,LinuxHOST=-DHOST_i386LDFLAGS=B.Makefile.common:1)包含了nachos提供的所有的基本程序(baselinecode),无论何时需要添加.h和.cc文件,都需要在相应的_H、_C和_O列表中修改;2)任务的依赖关系有:a)threads在所有程序之前;b)userprog在vm之前运行;c)userprog可在filesys之前或之后运行,但是如果先运行userprog,必须定义filesys_stub;3)当修改程序的架构时,应该在相应的子文件夹下执行makedepend,程序会自动修改Makefile并更新依赖性;4)CFLAGS=-g-Wall-Wshadow$(INCPATH)$(DEFINES)$(HOST)–DCHANGED:-g:在可执行程序中包含标准调试信息;-Wall:允许发出Gcc提供的所有有用的报警信息;-Wshadow:当局部变量遮蔽(shadow)了参数、全局变量或其他局部变量时,该选项会给我们警告信息;-DCHANGED:5)Depend函数:6)–DTHREADS:DthreadsisanefficientdeterministicmultithreadingsystemforunmodifiedC/C++applicationsthatreplacesthepthreadslibrary.C.Makefile:1)Lpr:将档案或是由标准输入送进来的资料送到打印机贮列之中,打印机管理程序lpd会在稍后将这个档案送给适当的程序或装置处理。lpr可以用来将料资送给本地或是远端的主机来处理。;2)Makenachos:D.3./nachos-3.4/code/threads/A.Makefile:和线程任务有关的Makefile,首先必须完成线程任务。B.Utility.cc:调试代码,通过命令行参数允许用户控制是否打印调试信息;1)DebugInit():只能打印flaglist的调试信息,即确定打印调试信息的部分;2)Debug():打印调试信息;C.Main.cc:初始化操作系统内核的引导程序代码。允许直接调用内部的操作系统函数来简化调试和测试。实际上,这些引导程序代码只是初始化数据结构,然后开启一个用户线程来打印注册提示。1)相关编译选项:nachos-ddebugflags-rsrandomseed#-s-xnachosfile-cconsoleInconsoleOut-f-cpunixfilenachosfile-pnachosfile-rnachosfile-l-D-t-nnetworkreliability-mmachineid-oothermachineid-z-dcausescertaindebuggingmessagestobeprinted(cf.utility.h)-rscausesYieldtooccuratrandom(butrepeatable)spots-zprintsthecopyrightmessageUSER_PROGRAM-scausesuserprogramstobeexecutedinsingle-stepmode-xrunsauserprogram-cteststheconsoleFILESYS-fcausesthephysicaldisktobeformatted-cpcopiesafilefromUNIXtoNachos-pprintsaNachosfiletostdout-rremovesaNachosfilefromthefilesystem-lliststhecontentsoftheNachosdirectory-Dprintsthecontentsoftheentirefilesystem-tteststheperformanceoftheNachosfilesystemNETWORK-nsetsthenetworkreliability-msetsthismachine'shostid(neededforthenetwork)-orunsasimpletestoftheNachosnetworksoftware备注:直到完成相关任务时这些选项才会起作用2)Main():操作系统内核的启动代码,工作有检查命令行参数,初始化数据结构,以及选择性地调用测试程序;3)Main()函数最后调用CurrentThread-Finish()函数,是因为nachos相对于宿主机来说只是一个程序,直接exit(0)会导致nachos退出,但是nachos系统中可能有等待线程,所以我们切换到这些线程告诉它们主线程已经结束,防止它们返回。D.system.h:定义了nachos所用的全局变量;E.system.cc:1)定义了所有的全局数据结构,并进行初始化和分配空间;Thread*currentThread;//thethreadwearerunningnowThread*threadToBeDestroyed;//thethreadthatjustfinishedScheduler*scheduler;//thereadylistInterrupt*interrupt;//interruptstatusStatistics*stats;//performancemetricsTimer*timer;//thehardwaretimerdevice,//forinvokingcontextswitches2)定义了Nachos两个函数:Initialize()和Cleanup();a)Initialize():初始化nachos的全局数据结构,诠释命令行参数;b)Cleanup():终止nachos,释放全局数据结构;3)TimerInterruptHandler():Timerdevice周期性(每个TimerTicks一次)中断CPU,然后每次会调用此函数,同时关闭中断。直接调用Yield()会挂起interrupthandler,而不是被中断的线程。不同的是,我们设置一个flag,所以当完成interrupthandler时,看起来就像是被中断的线程在中断时刻调用了Yield()。参数Intdummy(虚拟/假的)是因为interrupthandler都需要一个参数,无论是否需要;F.thread.cc(h):1)管理线程的数据结构,一个现场的状态包括pc、寄存器和执行栈;a)为每个栈分配固定的空间,所以要防止栈溢出,动态分配数据结构空间;b)调试是否是栈空间太小导致segmentationfault,可以增加占空间ThreadStackSize;c)Fork一个线程包括:先分配一个数据结构空间,然
本文标题:nachos代码阅读--xq
链接地址:https://www.777doc.com/doc-4594823 .html