中断阅读报告_XV6

中断阅读报告_XV6

ID:43842220

大小:579.11 KB

页数:9页

时间:2019-10-15

中断阅读报告_XV6_第1页
中断阅读报告_XV6_第2页
中断阅读报告_XV6_第3页
中断阅读报告_XV6_第4页
中断阅读报告_XV6_第5页
资源描述:

《中断阅读报告_XV6》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、中断、陷入和异常阅读报告一、代码阅读此次涉及的代码文件包括trapasm.S,trap.c,syscall.c,initcode.S,usys.S,vectors.S,lapic.c,ioapic.c,picirq.c。下面是各个文件的主要作用:trapasm.S:建立trapframe,调用trap(tf)函数,并在调用完trap函数后恢复现场;trap.c:包含加载和建立中断描述表,中断处理的函数;syscall.c:包含系统调用函数syscall()和获取系统调用参数的相关函数;initcode.S:起到初始化进程执

2、行的作用;usys.S:定义了SYSCALL_name的含义vectors.S:包含了中断描述表的256个入口定义;lapic.c:处理内置(non-I/O)的中断ioapic.c:为SMP系统管理硬件中断,包括ioapicenable()、ioapicinit()、ioapicwrite()、ioapicread()函数和ioapic结构。picirq.c:可编程中断控制器及相关函数、中断请求另外涉及到文件:spinlock.h(互斥锁)vm.c(转换栈,建立任务段描述符表)vectors.pl(激发中断和陷入的入口)1

3、、trapasm.S(中断描述表加载和入口建立完成之后,xv6操作系统通过硬件建立一个任务段描述符表,给寄存器%esp赋值和加载一个栈段选择器,并且函数(switchuvm()invm.c)将内核中的用户进程栈的栈顶值存储在栈段描述符表中。当陷入被击发时,如果处理器处于用户模式,它就从栈段描述符表中加载寄存器%esp和%ss,并本身的%ss和%esp压入新栈中;如果处理器处于内核模式,则什么也不发生。然后,处理器将eflags,%cs和%eip等压入栈中。对于某些陷入,处理器会将一个错误字压入栈中。最后,处理器从相应的ID

4、T入口处加载%eip和%cs。)然后,调用vectors.pl文件击发中断描述符表的入口,并且跳转到这个文件中来执行。)(1)建立trapframe当指令跳转到标签alltraps的时候,已经完成了如下工作:处理器将ss,esp,eflags,cs,eip压入栈中,处理器或者陷入向量将错误码压入栈中。如上代码,alltraps将ds,ed,fs,gs寄存器和所有剩余的32位通用寄存器压入栈中。这些工作完成之后,trapframe建立了,这个结构包含了陷入程序完成之后处理器恢复用户进程寄存器值的所有信息。(2)建立数据段和p

5、er-cpu段如代码所示,alltraps让寄存器ds,es中含有指向数据段的指针值;使得寄存器fs,gs中含有指向per-cpu数据段的指针值。(3)调用trap(trapframe)函数在代码运行到这里的时候,寄存器cs,ss,ds,es,fs,gs都已经建立,即此时可以通过这些寄存器获取指向代码段、栈段、数据段、标志段等段的指针。这时,寄存器esp存储着指向trapframe结构的指针值,它作为trap函数的参数,31行代码表示将esp的值传递给函数trap,32行代码调用trap函数。在trap函数执行完毕返回后,

6、将esp的值加4(一个单位),因为内存布局中栈是由高地址向低地址扩展的,因此将esp的值加4相当于将栈顶元素弹出,此时esp的值指向标签trapret。(4)恢复用户进程现场如代码所示,37行将所有的32位通用寄存器弹出栈,38-41行代码也是将对应的寄存器弹出栈;42行代码将esp的值增加8,也即将陷入号和错误代码弹出栈。栈清理完成后,调用iret指令,跳转到用户控件执行。(5)2、trap.c(1)tvinit()函数这个函数用来建立中断描述表的256个入口,并且interrupti是由数组vectors[i]中地址上

7、的代码处理的。首先,建立256个中断入口,这里函数SETGATE的参数含义如下:gate:idt[i]表示所要建立的中断门;istrap:0表示所要建立的是中断门描述符;sel:表示代码段选择器的索引值,这里SEG_KCODE=1,左移3位最后的值为8,表示内核代码段的一个选择器。off:中断或陷入程序的代码段的相对入口的偏移量。这里vectors[i]的值就是相应中断处理程序的地址;dpl:DescriptorPrivilledgeLevel中断描述符等级,数值越大等级越低,用来限制用户程序和内核的操作。这里,级别为0,

8、表示内核程序才能引发这个门。特别的,tvinit()函数中建立了系统调用的入口,用户程序可以调用。这里,T_SYSCALL的值为64,表明入口处在第64个位置。第二个参数1表示这是一个陷入程序描述符。内核将系统调用门的级别设置为DPL_USER,允许用户程序通过一个明确的int指令启用这个陷入门。最后,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。