第五章抢占调度lab3

上传人:博****1 文档编号:578187807 上传时间:2024-08-23 格式:PPT 页数:21 大小:281.02KB
返回 下载 相关 举报
第五章抢占调度lab3_第1页
第1页 / 共21页
第五章抢占调度lab3_第2页
第2页 / 共21页
第五章抢占调度lab3_第3页
第3页 / 共21页
第五章抢占调度lab3_第4页
第4页 / 共21页
第五章抢占调度lab3_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《第五章抢占调度lab3》由会员分享,可在线阅读,更多相关《第五章抢占调度lab3(21页珍藏版)》请在金锄头文库上搜索。

1、第五章,抢占式调度第五章,抢占式调度(lab3)提纲提纲n n用户环境的建立n n中断、系统调用用户环境的建立用户环境的建立n n用户执行环境数据结构的分配n n装载并执行用户环境用户环境的建立(续)用户环境的建立(续)n n用户环境用户环境(Environments)(Environments)数据结构的分配数据结构的分配n nenvsenvs是指向一个包含是指向一个包含10241024个(个(1NENV(10)1i386_init-ENV_CREATE(user_helloENV_CREATE(user_hello)- )- env_createenv_create-env_allocen

2、v_alloc-load_icodeload_icoden ni386_init-i386_init-env_runenv_runn n需要解决以下问题:需要解决以下问题:n n用户环境页表的配置与空间分配用户环境页表的配置与空间分配n n装载用户执行代码装载用户执行代码n n切换到用户执行代码切换到用户执行代码用户环境的建立(续)用户环境的建立(续)n n用户环境页表的配置与空间分配用户环境页表的配置与空间分配n n页表的配置页表的配置n n在在env_createenv_create-env_allocenv_alloc-env_setup_vmenv_setup_vmn n按照按照JOS

3、JOS的规划,用户执行的逻辑地址空间实际上是与内核共的规划,用户执行的逻辑地址空间实际上是与内核共享享4GB4GB,内核代码在,内核代码在lab2lab2中已经映射到中已经映射到KERNBASEKERNBASE(0xf00000000xf0000000)以上的空间,而剩下的低地址空间)以上的空间,而剩下的低地址空间则留给了用户执行代码则留给了用户执行代码n n构建用户环境的页表,为了保持内核部分的逻辑地址到物理内构建用户环境的页表,为了保持内核部分的逻辑地址到物理内存的映射关系,实际上可以将内核的地址映射关系拷贝到用户存的映射关系,实际上可以将内核的地址映射关系拷贝到用户环境的页表中来。环境的

4、页表中来。n n思考:通过拷贝,可以让用户环境顺利寻址到所有内核端的代思考:通过拷贝,可以让用户环境顺利寻址到所有内核端的代码,可是用户代码装载到的低地址空间,还没有实际的物理内码,可是用户代码装载到的低地址空间,还没有实际的物理内存页面与之进行映射,应该采用什么样的办法呢?是通过分配存页面与之进行映射,应该采用什么样的办法呢?是通过分配页面的办法将用户环境的空间填满,还是以后根据需要动态分页面的办法将用户环境的空间填满,还是以后根据需要动态分配页面?为什么?配页面?为什么?用户环境的建立(续)用户环境的建立(续)n n装载用户程序到内存(load_icode)n n函数原型函数原型load_

5、icode(structload_icode(struct EnvEnv *e, uint8_t *binary, *e, uint8_t *binary, size_tsize_t size) size)n n其中其中binarybinary指向用户程序在内存中的镜像(如何指向指向用户程序在内存中的镜像(如何指向的?)的?)n nSizeSize是用户程序在内存中镜像的大小是用户程序在内存中镜像的大小n nELFELF文件的装载过程文件的装载过程n nELFELF文件的格式(见第文件的格式(见第3 3章)章)n n将将ELFELF文件中的代码段、数据段、文件中的代码段、数据段、bssbss段

6、拷贝到段拷贝到EnvEnv *e *e指向的用户环境中(用哪一个指向的用户环境中(用哪一个CR3CR3会比较方便?)会比较方便?)n n找到用户程序的入口地址,并将该入口地址赋值到找到用户程序的入口地址,并将该入口地址赋值到e- e- env_tfenv_tf. . tf_eiptf_eip中中用户环境的建立(续)用户环境的建立(续)n n将用户环境投入执行n nenv_run(structenv_run(struct EnvEnv *e) *e)函数函数n n载入用户环境的页目录载入用户环境的页目录n n将将e-e-env_tfenv_tf中包含的寄存器值赋值到物理的寄中包含的寄存器值赋值到

7、物理的寄存器,使得用户环境中的程序开始执行存器,使得用户环境中的程序开始执行用户环境的建立(续)用户环境的建立(续)n n完成用户环境加载完成用户环境加载n n跟踪其运行过程,直到跟踪其运行过程,直到intint $0x30 $0x30n n思考思考n n1. 1. 如何赋值如何赋值e-e-env_tfenv_tf才能使装载进来的用户程序投入真才能使装载进来的用户程序投入真正的执行?正的执行?n n2. JOS2. JOS系统在系统在env_pop_tfenv_pop_tf之前都对之前都对e-e-env_tfenv_tf中的值做了哪中的值做了哪些初始化的工作?些初始化的工作?n n3. 3.

8、用户环境的堆栈段从什么地方开始?用户环境的堆栈段从什么地方开始?JOSJOS是如何实现是如何实现堆栈段的定位的?堆栈段的定位的?n n4. 4. env_pop_tfenv_pop_tf是如何工作的?为什么首先执行是如何工作的?为什么首先执行popalpopal来设来设置通用寄存器,而不是先置通用寄存器,而不是先pop pop env_tfenv_tf结构中后面的结构中后面的tf_sstf_ss和和tf_esptf_esp?中断、系统调用中断、系统调用n ni386的异常与中断n ni386的异常或中断处理过程n nTSS的作用与发生中断后堆栈的构成n nJOS中的异常处理n n缺页错误、系统

9、调用的实现中断、系统调用(续)中断、系统调用(续)n ni386i386的异常与中断的异常与中断n nExceptions and interrupts are both protected control Exceptions and interrupts are both protected control transfers, which cause the processor to switch from user to transfers, which cause the processor to switch from user to kernel mode (CPL=0) wit

10、hout giving the user-mode code any kernel mode (CPL=0) without giving the user-mode code any opportunity to interfere with the functioning of the kernel or opportunity to interfere with the functioning of the kernel or other environments. In Intels terminology, an other environments. In Intels termi

11、nology, an interruptinterrupt is a is a protected control transfer that is caused by an protected control transfer that is caused by an asynchronousasynchronous event usually external to the processor, such as notification of event usually external to the processor, such as notification of external

12、device I/O activity. An external device I/O activity. An exceptionexception, in contrast, is a , in contrast, is a protected control transfer caused protected control transfer caused synchronouslysynchronously by the by the currently running code, for example due to a divide by zero currently runnin

13、g code, for example due to a divide by zero or an invalid memory access. or an invalid memory access. n nExceptionException在在i386i386中与中与traptrap是一个意思,但中文翻译的时是一个意思,但中文翻译的时候往往翻译成异常或陷阱,其实也是一个意思候往往翻译成异常或陷阱,其实也是一个意思n n中断是一些异步事件(如中断是一些异步事件(如I/OI/O或程序的系统调用)或程序的系统调用)中断、系统调用(续)中断、系统调用(续)n ni386i386的异常或中断处理过

14、程的异常或中断处理过程n n异常或中断的设计是为了实现从用户态到核态的转换,异常或中断的设计是为了实现从用户态到核态的转换,同时实现对特权级代码的保护同时实现对特权级代码的保护n ni386i386采用两个机制来实现这一目标:采用两个机制来实现这一目标:IDTIDT和和TSSTSSn nIDT(InterruptIDT(Interrupt Descriptor Table) Descriptor Table)制定了制定了256256个中断入口,其个中断入口,其中前中前3232个用于异常个用于异常(traps(traps或或exceptions)exceptions),后面的,后面的( (中断号

15、中断号31)31)用于异步中断用于异步中断(interrupts)(interrupts)的处理。的处理。n n用户程序在运行过程中产生异常或者中断后,需要将产用户程序在运行过程中产生异常或者中断后,需要将产生中断的地方存储起来,以便在处理完中断后返回,可生中断的地方存储起来,以便在处理完中断后返回,可是存在什么地方呢?这里就要用到是存在什么地方呢?这里就要用到TSS(TaskTSS(Task State State Segment)Segment)中断、系统调用(续)中断、系统调用(续)n nTSSTSS的作用与发生中断后堆栈的构成的作用与发生中断后堆栈的构成n n本来本来IntelInte

16、l设计设计TSSTSS的初衷是想通过这个段,来实现操作的初衷是想通过这个段,来实现操作系统中多任务的切换系统中多任务的切换n n但使用这个切换任务,会占用很多但使用这个切换任务,会占用很多CPUCPU的时间,并且打的时间,并且打破破CPUCPU的流水。因而,的流水。因而,LinuxLinux和和WindowsWindows都没有采用都没有采用TSSTSS用作切换任务用作切换任务n nTSSTSS记录着记录着“ “I/OI/O权限位图权限位图” ”。另外。另外TSSTSS中还记录着中还记录着0-20-2环环的的espesp和和ss ss寄存器。当外环寄存器。当外环( (如如ring3)ring3

17、)进入内环进入内环( (如如ring0)ring0)时,时,会自动加载会自动加载TSSTSS中内环的中内环的espesp和和ss ss。那为什么。那为什么tsstss没有记录没有记录ring3ring3的的espesp和和ss ss呢?这是因为,外环进入内环时,会将呢?这是因为,外环进入内环时,会将这些压入堆栈。当从内环返回外环时,从堆栈中恢复这些压入堆栈。当从内环返回外环时,从堆栈中恢复就可以了就可以了中断、系统调用(续)中断、系统调用(续)n nTSS的结构n n其中最重要的是其中最重要的是espesp和和ss ssn n当从当从ring 3ring 3到到ring 0ring 0的过程的

18、过程中,会将断点通过压栈中,会将断点通过压栈存储到存储到ss ss和和espesp指向的堆指向的堆栈空间栈空间中断、系统调用(续)中断、系统调用(续)n n通过通过TSSTSS进行特权级转进行特权级转换并压栈后的内核堆换并压栈后的内核堆栈结构栈结构n n注:这些压栈动作都注:这些压栈动作都由由CPUCPU自动完成,不自动完成,不需要写代码来实现需要写代码来实现n n完成这些动作后,完成这些动作后,CPUCPU会根据发生中断会根据发生中断的中断号到的中断号到IDTIDT中寻找中寻找对应的中断处理函数,对应的中断处理函数,跳转过去执行跳转过去执行压入信息之后的内核堆栈结构带error code的内

19、核堆栈结构中断、系统调用(续)中断、系统调用(续)n nJOSJOS系统中断过程的控制流系统中断过程的控制流中断、系统调用(续)中断、系统调用(续)n n中断函数的建立中断函数的建立n n在在kern/kern/trapentry.Strapentry.S中建立各中建立各个中断处理函数的原型个中断处理函数的原型n n调用调用TRAPHANDLERTRAPHANDLER和和TRAPHANDLER_NOECTRAPHANDLER_NOEC宏,宏,并将创建的函数原型并将创建的函数原型externextern到到 n在在idt_initidt_init函数中初始化函数中初始化IDTIDTn n注意注意

20、SETGATESETGATE宏的使用宏的使用中断、系统调用(续)中断、系统调用(续)n n_ _alltrapalltrapn n首先注意调用首先注意调用_ _alltrapalltrap的方式是的方式是jmpjmp _ _alltrapsalltraps而不是而不是call _call _alltrapsalltraps!这意味着调用这意味着调用_ _alltrapsalltraps之前不需之前不需要将要将_ _alltrapsalltraps之后的指令之后的指令cs:eipcs:eip压压栈栈n n在进入在进入_ _alltrapsalltraps后,(系统)堆后,(系统)堆栈的组成:栈的

21、组成:n n接下来的工作,是要将堆栈组织接下来的工作,是要将堆栈组织成一个成一个TrapframeTrapframe结构,并将栈顶结构,并将栈顶指针指针espesp压栈,做为参数传递给压栈,做为参数传递给trap(structtrap(struct TrapframeTrapframe * *tf tf) )函数函数n n这里要注意这里要注意structstruct TrapframeTrapframe的构成,的构成,应该压栈哪些才能组成一个应该压栈哪些才能组成一个TrapframeTrapframe结构?结构?中断、系统调用(续)中断、系统调用(续)n n思考n n1. 1. 系统采用系统采

22、用i386i386提供的提供的TSSTSS机制顺利地从机制顺利地从ring3ring3转转换到换到ring0ring0,但是如何在处理完中断后从,但是如何在处理完中断后从ring0ring0回回到到ring3ring3呢?呢?n n2. 2. 系统如何保证从系统如何保证从ring0ring0回到回到ring3ring3后,仍然能够后,仍然能够继续用户环境的执行?继续用户环境的执行?中断、系统调用(续)中断、系统调用(续)n n缺页错误和断点中断n n改变中断处理流程,根据中断产生时的中断号改变中断处理流程,根据中断产生时的中断号进行相应的处理流程进行相应的处理流程n n修改修改trap_dispatchtrap_dispatchn n系统调用n n相应中断号:相应中断号:T_SYSCALLT_SYSCALL(0x30, 480x30, 48)n n从从lib/lib/syscall.csyscall.c 到到kern/kern/syscall.csyscall.c的调用路径的调用路径n n注意参数的传递注意参数的传递本章结束

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号