Presentation is loading. Please wait.

Presentation is loading. Please wait.

第五章,抢占式调度(lab3).

Similar presentations


Presentation on theme: "第五章,抢占式调度(lab3)."— Presentation transcript:

1 第五章,抢占式调度(lab3)

2 提纲 用户环境的建立 中断、系统调用

3 用户环境的建立 用户执行环境数据结构的分配 装载并执行用户环境

4 用户环境的建立(续) 用户环境(Environments)数据结构的分配
envs是指向一个包含1024个(1<<NENV(10))struct Env结构的指针,与pages指针非常类似,连建立链表的一些宏定义都和在页面管理中的一模一样 可以在分配完pages结构后,分配envs结构,并在env_init()函数中 在i386_vm_init()函数中,将envs结构映射到UENVS逻辑地址处

5 用户环境的建立(续) 装载并执行用户环境 相关的函数调用
i386_init->ENV_CREATE(user_hello)->env_create->env_alloc->load_icode i386_init->env_run 需要解决以下问题: 用户环境页表的配置与空间分配 装载用户执行代码 切换到用户执行代码

6 用户环境的建立(续) 用户环境页表的配置与空间分配 页表的配置
在env_create->env_alloc->env_setup_vm 按照JOS的规划,用户执行的逻辑地址空间实际上是与内核共享4GB,内核代码在lab2中已经映射到KERNBASE(0xf )以上的空间,而剩下的低地址空间则留给了用户执行代码 构建用户环境的页表,为了保持内核部分的逻辑地址到物理内存的映射关系,实际上可以将内核的地址映射关系拷贝到用户环境的页表中来。 思考:通过拷贝,可以让用户环境顺利寻址到所有内核端的代码,可是用户代码装载到的低地址空间,还没有实际的物理内存页面与之进行映射,应该采用什么样的办法呢?是通过分配页面的办法将用户环境的空间填满,还是以后根据需要动态分配页面?为什么?

7 用户环境的建立(续) 装载用户程序到内存(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中

8 用户环境的建立(续) 将用户环境投入执行 env_run(struct Env *e)函数 载入用户环境的页目录
将e->env_tf中包含的寄存器值赋值到物理的寄存器,使得用户环境中的程序开始执行

9 用户环境的建立(续) 完成用户环境加载 跟踪其运行过程,直到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?

10 中断、系统调用 i386的异常与中断 i386的异常或中断处理过程 TSS的作用与发生中断后堆栈的构成 JOS中的异常处理
缺页错误、系统调用的实现

11 中断、系统调用(续) 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或程序的系统调用)

12 中断、系统调用(续) i386的异常或中断处理过程 异常或中断的设计是为了实现从用户态到核态的转换,同时实现对特权级代码的保护
i386采用两个机制来实现这一目标:IDT和TSS IDT(Interrupt Descriptor Table)制定了256个中断入口,其中前32个用于异常(traps或exceptions),后面的(中断号>31)用于异步中断(interrupts)的处理。 用户程序在运行过程中产生异常或者中断后,需要将产生中断的地方存储起来,以便在处理完中断后返回,可是存在什么地方呢?这里就要用到TSS(Task State Segment)

13 中断、系统调用(续) 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呢?这是因为,外环进入内环时,会将这些压入堆栈。当从内环返回外环时,从堆栈中恢复就可以了

14 中断、系统调用(续) TSS的结构 其中最重要的是esp和ss
当从ring 3到ring 0的过程中,会将断点通过压栈存储到ss和esp指向的堆栈空间

15 中断、系统调用(续) 通过TSS进行特权级转换并压栈后的内核堆栈结构 注:这些压栈动作都由CPU自动完成,不需要写代码来实现
完成这些动作后,CPU会根据发生中断的中断号到IDT中寻找对应的中断处理函数,跳转过去执行 压入信息之后的内核堆栈结构 带error code的内核堆栈结构

16 中断、系统调用(续) JOS系统中断过程的控制流

17 中断、系统调用(续) 中断函数的建立 在kern/trapentry.S中建立各个中断处理函数的原型
调用TRAPHANDLER和TRAPHANDLER_NOEC宏,并将创建的函数原型extern到trap.c 在idt_init函数中初始化IDT 注意SETGATE宏的使用

18 中断、系统调用(续) _alltrap 首先注意调用_alltrap的方式是jmp _alltraps而不是call _alltraps!这意味着调用_alltraps之前不需要将_alltraps之后的指令cs:eip压栈 在进入_alltraps后,(系统)堆栈的组成: 接下来的工作,是要将堆栈组织成一个Trapframe结构,并将栈顶指针esp压栈,做为参数传递给trap(struct Trapframe *tf)函数 这里要注意struct Trapframe的构成,应该压栈哪些才能组成一个Trapframe结构?

19 中断、系统调用(续) 思考 1. 系统采用i386提供的TSS机制顺利地从ring3转换到ring0,但是如何在处理完中断后从ring0回到ring3呢? 2. 系统如何保证从ring0回到ring3后,仍然能够继续用户环境的执行?

20 中断、系统调用(续) 缺页错误和断点中断 系统调用 改变中断处理流程,根据中断产生时的中断号进行相应的处理流程
修改trap_dispatch 系统调用 相应中断号:T_SYSCALL(0x30, 48) 从lib/syscall.c 到kern/syscall.c的调用路径 注意参数的传递

21 本章结束


Download ppt "第五章,抢占式调度(lab3)."

Similar presentations


Ads by Google