欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    第五章抢占式调度lab3.ppt

    • 资源ID:2582776       资源大小:281.01KB        全文页数:21页
    • 资源格式: PPT        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第五章抢占式调度lab3.ppt

    第五章,抢占式调度(lab3),提纲,用户环境的建立 中断、系统调用,用户环境的建立,用户执行环境数据结构的分配 装载并执行用户环境,用户环境的建立(续),用户环境(Environments)数据结构的分配 envs是指向一个包含1024个(1NENV(10))struct Env结构的指针,与pages指针非常类似,连建立链表的一些宏定义都和在页面管理中的一模一样 可以在分配完pages结构后,分配envs结构,并在env_init()函数中 在i386_vm_init()函数中,将envs结构映射到UENVS逻辑地址处,用户环境的建立(续),装载并执行用户环境 相关的函数调用 i386_init-ENV_CREATE(user_hello)-env_create-env_alloc-load_icode i386_init-env_run 需要解决以下问题: 用户环境页表的配置与空间分配 装载用户执行代码 切换到用户执行代码,用户环境的建立(续),用户环境页表的配置与空间分配 页表的配置 在env_create-env_alloc-env_setup_vm 按照JOS的规划,用户执行的逻辑地址空间实际上是与内核共享4GB,内核代码在lab2中已经映射到KERNBASE(0xf0000000)以上的空间,而剩下的低地址空间则留给了用户执行代码 构建用户环境的页表,为了保持内核部分的逻辑地址到物理内存的映射关系,实际上可以将内核的地址映射关系拷贝到用户环境的页表中来。 思考:通过拷贝,可以让用户环境顺利寻址到所有内核端的代码,可是用户代码装载到的低地址空间,还没有实际的物理内存页面与之进行映射,应该采用什么样的办法呢?是通过分配页面的办法将用户环境的空间填满,还是以后根据需要动态分配页面?为什么?,用户环境的建立(续),装载用户程序到内存(load_icode) 函数原型load_icode(struct Env *e, uint8_t *binary, size_t size) 其中binary指向用户程序在内存中的镜像(如何指向的?) Size是用户程序在内存中镜像的大小 ELF文件的装载过程 ELF文件的格式(见第3章) 将ELF文件中的代码段、数据段、bss段拷贝到Env *e指向的用户环境中(用哪一个CR3会比较方便?) 找到用户程序的入口地址,并将该入口地址赋值到e-env_tf. tf_eip中,用户环境的建立(续),将用户环境投入执行 env_run(struct Env *e)函数 载入用户环境的页目录 将e-env_tf中包含的寄存器值赋值到物理的寄存器,使得用户环境中的程序开始执行,用户环境的建立(续),完成用户环境加载 跟踪其运行过程,直到int $0x30 思考 1. 如何赋值e-env_tf才能使装载进来的用户程序投入真正的执行? 2. JOS系统在env_pop_tf之前都对e-env_tf中的值做了哪些初始化的工作? 3. 用户环境的堆栈段从什么地方开始?JOS是如何实现堆栈段的定位的? 4. env_pop_tf是如何工作的?为什么首先执行popal来设置通用寄存器,而不是先pop env_tf结构中后面的tf_ss和tf_esp?,中断、系统调用,i386的异常与中断 i386的异常或中断处理过程 TSS的作用与发生中断后堆栈的构成 JOS中的异常处理 缺页错误、系统调用的实现,中断、系统调用(续),i386的异常与中断 Exceptions and interrupts are both “protected control transfers,“ which cause the processor to switch from user to kernel mode (CPL=0) without giving the user-mode code any opportunity to interfere with the functioning of the kernel or other environments. In Intel's terminology, an interrupt is a protected control transfer that is caused by an asynchronous event usually external to the processor, such as notification of external device I/O activity. An exception, in contrast, is a protected control transfer caused synchronously by the currently running code, for example due to a divide by zero or an invalid memory access. Exception在i386中与trap是一个意思,但中文翻译的时候往往翻译成异常或陷阱,其实也是一个意思 中断是一些异步事件(如I/O或程序的系统调用),中断、系统调用(续),i386的异常或中断处理过程 异常或中断的设计是为了实现从用户态到核态的转换,同时实现对特权级代码的保护 i386采用两个机制来实现这一目标:IDT和TSS IDT(Interrupt Descriptor Table)制定了256个中断入口,其中前32个用于异常(traps或exceptions),后面的(中断号31)用于异步中断(interrupts)的处理。 用户程序在运行过程中产生异常或者中断后,需要将产生中断的地方存储起来,以便在处理完中断后返回,可是存在什么地方呢?这里就要用到TSS(Task State Segment),中断、系统调用(续),TSS的作用与发生中断后堆栈的构成 本来Intel设计TSS的初衷是想通过这个段,来实现操作系统中多任务的切换 但使用这个切换任务,会占用很多CPU的时间,并且打破CPU的流水。因而,Linux和Windows都没有采用TSS用作切换任务 TSS记录着“I/O权限位图”。另外TSS中还记录着0-2环的esp和ss寄存器。当外环(如ring3)进入内环(如ring0)时,会自动加载TSS中内环的esp和ss。那为什么tss没有记录ring3的esp和ss呢?这是因为,外环进入内环时,会将这些压入堆栈。当从内环返回外环时,从堆栈中恢复就可以了,中断、系统调用(续),TSS的结构 其中最重要的是esp和ss 当从ring 3到ring 0的过程中,会将断点通过压栈存储到ss和esp指向的堆栈空间,中断、系统调用(续),通过TSS进行特权级转换并压栈后的内核堆栈结构 注:这些压栈动作都由CPU自动完成,不需要写代码来实现 完成这些动作后,CPU会根据发生中断的中断号到IDT中寻找对应的中断处理函数,跳转过去执行,压入信息之后的内核堆栈结构,带error code的内核堆栈结构,中断、系统调用(续),JOS系统中断过程的控制流,中断、系统调用(续),中断函数的建立 在kern/trapentry.S中建立各个中断处理函数的原型 调用TRAPHANDLER和TRAPHANDLER_NOEC宏,并将创建的函数原型extern到trap.c 在idt_init函数中初始化IDT 注意SETGATE宏的使用,中断、系统调用(续),_alltrap 首先注意调用_alltrap的方式是jmp _alltraps而不是call _alltraps!这意味着调用_alltraps之前不需要将_alltraps之后的指令cs:eip压栈 在进入_alltraps后,(系统)堆栈的组成: 接下来的工作,是要将堆栈组织成一个Trapframe结构,并将栈顶指针esp压栈,做为参数传递给trap(struct Trapframe *tf)函数 这里要注意struct Trapframe的构成,应该压栈哪些才能组成一个Trapframe结构?,中断、系统调用(续),思考 1. 系统采用i386提供的TSS机制顺利地从ring3转换到ring0,但是如何在处理完中断后从ring0回到ring3呢? 2. 系统如何保证从ring0回到ring3后,仍然能够继续用户环境的执行?,中断、系统调用(续),缺页错误和断点中断 改变中断处理流程,根据中断产生时的中断号进行相应的处理流程 修改trap_dispatch 系统调用 相应中断号:T_SYSCALL(0x30, 48) 从lib/syscall.c 到kern/syscall.c的调用路径 注意参数的传递,本章结束,

    注意事项

    本文(第五章抢占式调度lab3.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开