操作系统课件_第1页
操作系统课件_第2页
操作系统课件_第3页
操作系统课件_第4页
操作系统课件_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

实验3

UserEnvironments实验内容首先要说明的是:这里的Environment类似于UNIX系统中的process用户进程管理;加载用户程序(ELF格式);用户程序的组成部分和编译;中断和异常处理增加系统调用实验指导Chapter5.pdfJOS_exp_3.pdf实验3增加的代码inc/env.h Publicdefinitionsforuser-modeenvironments trap.hPublicdefinitionsfortraphandling syscall.hPublicdefinitionsforsystemcallsfromuserenvironmentstothekernel lib.h Publicdefinitionsfortheuser-modesupportlibrarykern/env.hKernel-privatedefinitionsforuser-modeenvironments env.cKernelcodeimplementinguser-modeenvironments trap.hKernel-privatetraphandlingdefinitions trap.cTraphandlingcode trapentry.SAssembly-languagetraphandlerentry-points syscall.hKernel-privatedefinitionsforsystemcallhandling syscall.cSystemcallimplementationcodelib/MakefragMakefilefragmenttobuilduser-modelibrary,obj/lib/libuser.a entry.SAssembly-languageentry-pointforuserenvironments libmain.cUser-modelibrarysetupcodecalledfromentry.S syscall.cUser-modesystemcallstubfunctions console.cUser-modeimplementationsofputcharandgetchar,providingconsoleI/O exit.cUser-modeimplementationofexit panic.cUser-modeimplementationofpanicuser/* Varioustestprogramstocheckkernellab3code合并实验3的代码gitcheckout-blab3origin/lab3gitmergelab2用户进程管理(数据结构)表示用户进程信息的数据结构(进程控制块pcb):

structEnv{

structTrapframeenv_tf;//Savedregisters LIST_ENTRY(Env)env_link;//Freelistlinkpointers u_intenv_id;//Uniqueenvironmentidentifier u_intenv_parent_id;//env_idofthisenv'sparent u_intenv_status;//Statusoftheenvironment

Pde*env_pgdir;//Kernelvirtualaddressofpagedir u_intenv_cr3;//Physicaladdressofpagedir };structEnv数组:structEnv*envs=NULL,*curenv=NULL;空闲structEnv链表:structEnv_listenv_free_list;用户进程管理(功能函数)env_init():分配structEnv数组内存和初始化空闲evn链表i386_vm_init()中增加映射Env数组到UENVS

到这里应该明白mitjos内存布局设计中的每一部分含义(inc/memlayout.h)用户进程管理(功能函数2)env_create()env_alloc()//初始化env数据结构中的所有成员变量(内存布局,Trapframe寄存器)env_setup_vm()//初始化内存布局load_icode()//加载elf文件内容segment_alloc()//实际分配物理内存,并映射到该进程的虚拟内存用户进程管理(功能函数3)env_run()env_pop_tf()iretESP虚拟内存Trapframe|SSESPEFLAGS|CSEIPerrorcodeinterruptnum|DSpushal|ES低地址高地址用户程序用户程序的组成:user/hello.c:用户程序代码lib/*:实现用户程序的初始化封装系统调用,方便用户程序调用编译:首先把lib/*编译成静态链接库libjos.alib/entry.S+libjos.a+libgcc.a+hello.c->hellouser/user.ld(注意内存布局)运行:startsrunningatlib/entry.Scallslibmain(),inlib/libmain.clibmain()thencallsumain()用户程序集成因为目前没有文件系统,所以把编译之后的多个应用程序(ELF文件)直接集成到kernel中ld...-bbinaryobj/user/helloobj/user/buggyhello...nm-nobj/kern/kernel>obj/kern/kernel.symi386_init()ENV_CREATE(user_hello)#defineENV_CREATE(x) { \ externuint8_t_binary_obj_##x##_start[], \ _binary_obj_##x##_size[]; \ env_create(_binary_obj_##x##_start, \ (int)_binary_obj_##x##_size); \}x86保护方式下的中断和异常Interrupts(中断)可屏蔽中断,INTR引脚不可屏蔽中断,NMI引脚Exceptions(异常)处理器自动检测触发:除数为0,无效指令,一般保护性错误,页故障,等等指令触发(软中断):INTO,INT3,INTn,BOUND中断和异常用一个整数来标示:NMI和异常:0~31中断:32~255x86保护方式下的中断和异常Exceptions(异常)Fault(故障):重新执行引起故障的指令Taps(陷阱):执行下一条指令Aborts(中止):严重的系统错误,不容易定位引发错误的指令x86保护方式下的中断和异常IDTR长度为48位的寄存器。其中32位用作中断描述符表在存储器中的线性基地址,16位为该表所占的主存空间的字节大小-1。它们分别被称为基址字段和界限字段

线性基址界限主存中断描述符0中断描述符1中断描述符2描述符255015031IDTRx86保护方式下的中断和异常中断描述符中断01110:进入中断后,EFLAGS中的IF自动复位为0,即自动屏蔽中断异常01111:不改变EFLAGS中的IFx86保护方式下的中断和异常中断入口中断描述符也叫做中断门(gate)x86保护方式下的中断和异常中断进入过程(用户模式-->核心模式)切换到核心模式的堆栈SS,ESP把用户模式下的SS,ESP,EFLAGS,CS,EIP压栈EFLAGS中的TF和IFERRORCODEx86保护方式下的中断和异常核心模式的堆栈SS,ESP通过任务状态段TSS来获取TR任务寄存器

段选择字015x86保护方式下的中断和异常2已经在核心模式下的中断进入不切换堆栈,只把EFLAGS,CS,EIP压栈EFLAGS中的TF和IF:同用户模式ERRORCODE:同用户模式

Thereisoneimportantcaveattotheprocessor'snestedexceptioncapability.Iftheprocessortakesanexceptionwhilealreadyinkernelmode,andcannotpushitsoldstateontothekernelstackforanyreasonsuchaslackofstackspace,thenthereisnothingtheprocessorcandotorecover,soitsimplyresetsitself.Needlesstosay,thekernelshouldbedesignedsothatthiscan'thappen.x86保护方式下的中断和异常序号描述类型errorcode指令0除法错,除数为0FaultNo整数除法1调试Fault/TrapNo3断点TrapNoINT34overflowTrapNoINTO5BoundscheckFaultNoBOUND6无效指令FaultNo无效指令7coprocessor无效FaultNo8doublefaultAbortYes10无效TSSFaultYes11segmentnotpresentFaultYes12stackexceptionFaultYes13一般保护性故障FaultYes14页故障FaultYes访问内存代码16浮点错误FaultNo32~255中断TrapNoINTn权限CPL:是当前进程的权限级别,存在于cs寄存器的低两位;RPL:是进程对段访问的请求权限,位于段选择符的低两位;DPL:存储在段描述符和中断描述符中,规定访问该段的权限级别和通过该中断门的权限;

核心态的权限级别为0,用户态为3 max(CPL,RPL)<=DPL中断过程初始化中断描述符表:trap.c:idt_init()完成各个中断处理的入口代码:trapentry.S中断处理的统一入口代码:trapentry.S:_alltrapstrap.c:trap()中断处理;中断返回:env_run()->env_pop_tf()中断过程的堆栈中断进入

温馨提示

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

评论

0/150

提交评论