nachos-Lab6实习报告_第1页
nachos-Lab6实习报告_第2页
nachos-Lab6实习报告_第3页
nachos-Lab6实习报告_第4页
nachos-Lab6实习报告_第5页
已阅读5页,还剩12页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、报告系统调用实习目录内容一:总体概述 错误! 未定义书签。内容二:任务完成情况 错误! 未定义书签。任务完成列表( Y/N) 错误! 未定义书签。具体 Exercise 的完成情况 错误 ! 未定义书签。内容三:遇到的困难以及解决方法 错误! 未定义书签。内容四:收获及感想 错误! 未定义书签。内容五:对课程的意见和建议 错误! 未定义书签。内容六:参考文献 错误! 未定义书签。17内容一:总体概述本次lab的主要内容是实现nachos定义的系统调用。理论方面,我们 需要了解nachos系统调用的实现原理,实践方面,我们需要实现文进系统相关 系统调用和用户程序相关系统调用,并且编写用户程序验证

2、相关系统调用的正确 性。内容二:任务完成情况任务完成列表(Y/N)Exercise1Exercise2Exercise3Exercise4Exercise5YYYYY具体Exercise的完成情况一、理解Nachos系统调用Exercise 1源代码阅读阅读与系统调用相关的源代码,理解系统调用的实现原理。code/userprog/code/userprog/code/test/userprog/定义nachos的系统调用,主要包括系统调用号和系统调用函数, 内核通过识别用户程序传递的系统调用号确定系统调用类型已经实现的系统调用包括void Halt();关闭nachos虚拟机,打印性能统计信

3、息需要实现的系统调用包括:3种系统调用涉及地址空间:1) 、void Exit(int status);用户程序完成,status = 0 表示正常退出2) 、SpaceId Exec(char *name);加载并执行名字是name的Nachos可执行文件,返回其地址空间的标志符SpaceId实际是整型,标识地址空间3) 、 int Join(SpaceId id);等待标志符为 id 的用户线程运行完毕,返回其退出状态5 种系统调用涉及文件系统:1) 、 void Create(char *name);创建文件名name的Nachos文件2) 、 Ope nFileId Open(char

4、 *name);打开文件名name的Nachos文件,返回打开文件标志符OpenFileId 实际是整形,标识打开文件3) 、void Write(char *buffer, int size, OpenFileId id);向标志符是 id 的文件写入 buffer 中长度为 size 字节的数据4) 、int Read(char *buffer, int size, OpenFileId id);从标志符是 id 的文件读取长度为 size 字节的数据存入 buffer ,返回实际读取 的字节数5) 、void Close(OpenFileId id);关闭标志符是 id 的文件2 种系统

5、调用涉及用户级线程,用于支持多线程用户程序:1) 、void Fork(void (*func)(); 创建和当前线程拥有相同地址空间的线程,运行 func 指针指向的函数2) 、void Yield();当前线程让出 CPUcode/userprog/ 定义进行异常处理的 ExceptionHandler 函数,主要流程是 根据异常信息处理不同异常,包括系统调用目前支持的异常 :NoException, lobl _start.ent_start_start:jalmainnd _start(2) 系统调用:用户程序执行系统调用时,将系统调用号存入r2 寄存器,然后跳转到执行,例如系统调用

6、Halt :Halt:addiu $2,$0,SC_Halt nd Halt系统调用相关寄存器:r2- 系统调用号,系统调用返回值r4- 系统调用参数 1r5- 系统调用参数 2r6- 系统调用参数 3r7- 系统调用参数 4系统调用主要流程:machine的Run函数运行用户程序,实现在 machine/,基本流程是通过OneInstruction 函数完成指令译码和执行,通过 interrupt 的 OneTick 函数使 得时钟前进(1)OneInstruction 函数判断当前指令是系统调用,转入(2)通过确定系统调用入口, 通过寄存器 r2 传递系统调用号, 转入(此时 系统调用参数

7、位于相应寄存器)(3)通过系统调用号识别系统调用,进行相关处理,如果系统调用存在返 回值,那么通过寄存器 r2 传递,流程结束时,需要更新 PC(4)系统调用结束,程序继续执行添加系统调用:(1)定义系统调用接口、系统调用号(2)code/test/ 添加链接代码(3)添加系统调用处理过程二、文件系统相关的系统调用Exercise 2 系统调用实现类比 Halt 的实现,完成与文件系统相关的系统调用: Create, Open, Close ,Write , Reac。文件中有这些系统调用基本说明。基本思路:修改 userprog/ ,按照 userprog/ 的定义实现系统调用 系统调用 C

8、reate 定义voic Create(char *name);系统调用 Create 基本流程(1)通过寄存器 r4 获得文件名指针(2)使用文件名指针通过已经实现 ReadMer函数获得文件名( 3)通过已经实现的 Create 函数创建文件(4)通过函数PC_advanee更新PCelse If(hi仁h = SyscallExceptton) & (type = SC_Create) prtntf(,hsysten call Createnh); int address = machtne-ReadRegtster(4);char nane10:int pos = 0;tnt data

9、; whUe(l) nachlne-ReadMen(address + pas, 1, &data); if (data = 0) naiwpos = *fi*; break; nanepos+ = char(data); ftLeSysten-Create(nane, 128): machine-PC_advan匚); _void Machine: PC_advance() WriteRegis tm(PEPCR.egFEgist:e0PfREg ); WrtteReglsterfPCRegf regtstersPCReg+&tzeof(tnt);WriteRegister(NextPCRe

10、g(registersNextPCReg+stzeof(tnt ); 系统调用Open定义OpenF ileld Open( char *n ame);系统调用Open基本流程(1) 通过寄存器r4获得文件名指针(2) 使用文件名指针通过已经实现 ReadMer函数获得文件名(3) 通过已经实现的Open函数打开文件(4) 返回值(打开文件数据结构)写入寄存器 r2(5) 通过函数PC_advanee更新PCelse tf(which = SyscallExcepttan) &.& (type = SC Open) prtntf ( h, system call Openn );tnt add

11、ress = nachtne-ReadRegtster(4); char nane10: int po = 0;int data: whtle(l) ndchtne-ReadMem(address + pos, 1, Sdata); tf (data = 9) namepos = 101; br-eak;namepos+ = ehar(data);OpenFile *openfi.Ie = ftleSysten-Open(name); machine- WrtteRegtster (2, tnt(ope-nf ile); machine PC_advance();系统调用Close定义void

12、 Close(OpenFileld id);系统调用Close基本流程(1) 通过寄存器r4获得打开文件数据结构(2) 通过打开文件数据结构析构函数关闭文件(3) 通过函数PC_advanee更新PCelse tf(whi.ch - SyscallException) (type 二二 SC_Close) prtntf(system call CLosen);tnt fd 二 ndchtne-ReadRegister(4);OpenFtle *openftle = (OpenFile*)fd; delete openftie;ma匸htne-PC_advance(); 系统调用Read定义in

13、t Read(char *buffer, int size, OpenFileId id);系统调用Read基本流程(1) 通过寄存器r4获得缓冲区指针,通过寄存器r5获得数据长度,通过 寄存器r6获得打开文件数据结构(2) 通过已经实现的Read函数读取文件相关内容,记录实际读出字节数(3) 通过已经实现的WriteMem函数将文件内容写入缓冲区(4) 返回值(实际读出字节数)写入寄存器r2(5) 通过函数PC_advanee更新PCelse if(which -= SyscallException) & (type = SCRead) prtntf(占ystEin 匸白 11 Readn*

14、);int base_posttion = machineRedRegtster(4);tnt count = nachtne-ReadRegtstnt fd = nachine-ReadRegister(6);OpenFtle *openftle = (OpenFlle*)fd;char contentcount;tnt result = openfile-Read(content, count;for (tnt 1. = e; x WrtteHem(base_position + i, 1, tnt(contenti); machine-WrtteRegister(2, result):

15、machine -PC_advance(); _系统调用Write定义void Write(char *buffer, int size, OpenFileld id);系统调用Write基本流程(1) 通过寄存器r4获得缓冲区指针,通过寄存器r5获得数据长度,通过 寄存器r6获得打开文件数据结构(2) 通过已经实现的ReadMer函数获得缓冲区数据(3) 通过已经实现的Write函数将缓冲区内容写入文件(4) 通过函数PC_advanee更新PCelse If(which = SyscaILException) & (type = SCWrite) printf(syst巳n calL Wr

16、tten);int base_position = machine-ReadRegtster(4);tnt count = machine-ReddRegtster(5:int fd = machine-ReadRegtster(6);char content匚ount;tnt data;for (tnt t = 0; t ReadMen(base_posttio门 +1, &data);con= char(dat):OpenFtle *openftie = (OpenFile*)fd;openfile-Write(content, count);fnachine-PC_advance();E

17、xercise 3编写用户程序编写并运行用户程序,调用练习2中所写系统调用,测试其正确性。用户程序基本思路创建文件(系统调用Create)打开文件(已经存在,内容hello_world )(系统调用Open)打开文件(系统调用Oper)读入文件内容,记录读入字节数(系统调用Read)内容写入文件(系统调用Write)关闭文件(系统调用Close)关闭文件(系统调用Close)include syscalt.h tnt fdl,fd2;int result; char buffer2;int natn()匚 reate( ,rwrtte*txt); fdi = 0pen(read-txt); f

18、d2 = Open(wrxte*txfF); result = Readfbuffer, 29, fdl); Wrtte(buffer, result, fd2); ClQse(fdl);Close(fd2);/* not reached */用户程序的添加修改 test/MakeFileall: halt shell matmult sorttestl$(CC) $(CFLAGS) -c testl:$(LD) $(LDFLAGS) -o./bin/coff2noff test1用户程序的执行qInhdnn Lnubuntu; /ndchuh/ndLhtia_lLdntl/njLlnjb -

19、 3.47codt?/uierpr wgS /ridthos Eysten call Createsysten call Open system call Open system call Read system call Write system call Close system call Close systen csll Malt Machine halting!检查userprog文件夹,出现文件exceptions匚 x syscall.h x t , write.txt x1 hello_world|可以发现,相关内容顺利写入,符合实际三、执行用户程序相关的系统调用Exercis

20、e 4 系统调用实现实现如下系统调用:Exec, Fork,Yield ,Join,Exit。文件中有这些系统调用基本说明系统调用Exec定义Spaceld Exec(char *n ame);系统调用Exec基本流程(1) 通过寄存器r4获得文件名指针(2) 建立线程,通过函数exec_func执行用户程序(3) 返回值(线程ID)写入寄存器r2(4) 通过函数PC_advanee更新PC函数exec_func基本流程(1) 使用文件名指针通过已经实现 ReadMer函数获得文件名(2) 通过已经实现的Open函数打开文件(3)通过已经实现的AddrSpace的构造函数初始化地址空间(4)通

21、过已经实现的InitRegisters函数初始化寄存器(5)通过已经实现的RestoreState函数装载页表(6) 通过已经实现的Run函数运行用户程序重要部分可以仿照StartProcess函数实现else tf(which = SyscallEx.ceptton) &呂(type = SC_Exec) printfCsysten call Excnvl);int address = ndchine-ReadRegLster(4);Thread* newthread = new Thread(second thread); newthresd-Fork(exec_func, address

22、);nachine-WriteRegister(2, newthread-getThreddlD(); machine-PC_advance();void exec f unc(int address) char namefie;int pos = 0;tnt data;while(l) nachtne-ReadMem(sddres5 十 pos f 1? Sdata); if (data = 0) nanepos = 10;break;n anepos-Dpen(nane);AddrSpace *spa匚亡;spa匚e = new AddrSpacefexecutable);current

23、Th read-space = space;delete executable;spa匚亡-AlnitRwgiEtE生();spaCE-AREStO厂);machine-Run();)系统调用Fork定义void Fork(void (*func)();系统调用Fork基本流程(1) 通过寄存器r4获得函数位置(2) 复制当前进程地址空间注意到AddrSpace的构造函数需要打开文件作为输入,所以增加线程属性,记录当前线程对应打开文件的名称,实现Fork函数时,需要逐页复制页表内容(3) 建立线程,执行函数fork_func(4) 通过函数PC_advanee更新PCelse if(which

24、 二二 SyscalIException) & ttype = SC_Fork) prirtf(systen call Forlcn) * tnt function_pc = nachtne-ReadRegister(4);openFtle executable - ftLeSysten- Qpen (currentTh reed -f tlenane); Addrspa匚e *space = new Addrspa匚e(便xe匚ulablE);space-AddrSpace 匚 py(tu 厂 rmtThEad-A曽 patE;Info* info = new Info;tnfo-space

25、 二 space;tnfc- ipc = functi.on_pc;Thread* new=new Thread( second thread);newthread-Fork(fork_func, tnX(info);nactine-pt;_advance(7; 一函数Fork_fune基本流程(1) 设置当前线程地址空间(2) 通过已经实现的InitRegisters函数初始化寄存器(3) 通过已经实现的RestoreState函数装载页表(4) 设置当前线程PC(5) 通过已经实现的Run函数运行用户程序void fork_func(tnt address) _Info *info = (

26、Info*)address;AddrSpa匚己 *spa匚童=info*space;currentThread*space 二 space;tnt current pc = Info -pc;space -lnitRegisters();space -RestoreState();nachtne-WrtteRegtster(PCReg* current pc); nachtne*WriteRegtster(NextPCReg, currentpc + 4); machine-Run();)系统调用Yield定义void Yield();系统调用Yield基本流程(1 )通过函数PC_advan

27、ee更新PC(2)通过已经实现的Yield函数实现线程切换这里需要先更新PC,否则陷入死循环else If(which = SyscallException) & (type = SC_YteLd) printf(system call teldn);machine-PC_advance(); currentThread-Yteld();系统调用Join定义int Join( Spaeeld id);系统调用Join基本流程(1) 通过寄存器r4获得线程ID(2) 检查全局数组ThreadID,确定特定线程是否处于活跃状态,如果特定 线程处于活跃状态,那么进行线程切换根据前面已经实现的机制,线

28、程构造函数会分配线程ID,线程析构函数会回收线程ID,所以能够通过线程ID确定特定线程是否处于活跃状态(3) 通过函数PC_advanee更新PCelse If(which = SyscallException) & (type = SCJoin) prtntf(system call JotnnTr);tnt threadid = nachine-ReadRegtster(4); while (ThreadIDthreadtd)cur rentThread -ield();nachvneadvance();) _系统调用Exit定义void Exit(i nt status)系统调用Exit

29、基本流程(1) 通过寄存器r4获得退出状态,输出相关信息(2) 通过已经实现的clear函数释放页表相关空间(3) 通过函数PC_advanee更新PC(4) 通过已经实现的Finish函数结束当前线程else if(which = SyscalLlException) & (type = SC_Extt) printf (hlsystem call Exttn,h);tnt status = machtne-ReodRegtsprintf(,rprogramme exit with status %dn, status); rnachtne-clear();machine-PC_advafi

30、ce();匚ur rentThread-Ftnish(;Exercise 5 编写用户程序编写并运行用户程序,调用练习4中所写系统调用,测试其正确性。用户程序1基本思路(1) 通过系统调用Exec执行特定文件(2) 通过系统调用Yield进行线程切换涉及系统调用:Exec、Yield、Exit#i nclude int mai n()Exec(halt);Yield();用户程序1执行结果(1)主线程分配空间,开始执行(2)执行系统调用Exec,建立新线程,准备执行halt(3) 执行系统调用Yield,主线程进行线程切换(4) 新线程分配地址空间,开始执行(5) 新线程执行完成,执行系统调用

31、Exit,释放地址空间,输出相关信息(6) 主线程执行完成,执行系统调用Exit,释放地址空间,输出相关信息 结果如下,符合实际allocatemeniDry0memory1allocatememory2atlocatememo ry3menory4allocatenemory5ailLoetemewry6allocatemeniory7allocatememory8allo匚日tEnenory9allocate们emory10system call Execsysten call Yieldallocatememory11allocate nenory 12匚at牡 menory 13 bI

32、Io匸己te nenory 14 aLLo匚ate memory 15 alloeatt nemory 16 allocate memory 17 心llo匚忌nenory 18 allocate memory 19 LlQCEtu menory 20system call Exit programme exit with status 6 deallocate nemory 11 deallocate nenory 12 deallocate memory 13 deallocate me-mory 14 deallocate memory 15 deallocate memory 16 d

33、eallocate m&nory 17 deallocate memory 18 deallocate memory 19 deallocate memory 20 system call Exitprogramme exit with status fl deallocate memory 0 deallocate memory 1 deallocate menory 2 deallocate nemory 3 deallocate memory 4 deallocate memory 5 deallocate memory 6 deallocate memory 1 deallocate

34、memory 8 deallocate memory 9 deallocate memory 10用户程序2基本思路(1)通过系统调用Exec执行特定文件(2)通过系统调用Join等待新线程结束涉及系统调用:Exec、Join、Exit#i nclude int mai n()int id = Exec(halt);Joi n( id);用户程序2执行结果(1)主线程分配空间,开始执行(2)执行系统调用Exec,建立新线程,准备执行halt(3)执行系统调用Join,新线程没有结束,主线程进行线程切换(4)新线程分配地址空间,开始执行(5) 新线程执行完成,执行系统调用Exit,释放地址空间,

35、输出相关信息(6) 主线程执行完成,执行系统调用Exit,释放地址空间,输出相关信息 结果如下,符合实际0123allocateallocate allocate allocate allocate allocate allocate allocth tE allocate allocatememory nenory nenory memory rtenory nenory memory memory nenory memory memory5678916system call Exec system call Join allocate allocate allocate allocate allocate alloca allocate allocate allocate allocatemenory memory menory memory memory nenory nenory menory memory nenory11121314151617181920systen call Exitprogramm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论