课程学习总结报告
Posted gfsh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了课程学习总结报告相关的知识,希望对你有一定的参考价值。
中断的简要介绍:
中断的出现是为了解决cpu和外设I/O之间速度不匹配的问题,硬件上每个外设都会连接一个设备管理器,该管理器连接中断处理器,再连cpu,如图所示
每个能够发出中断请求的硬件设备控制器都有一条称为IRQ(Interrupt ReQuest)的输出线。所有的IRQ线都与一个中断控制器的输入
引脚相连,中断控制器与CPU的INTR引脚相连,有很多IRQ线连接在中断控制器上,所以需要编号,中断处理器通过数据总线把编号传给cpu,接着通过INTR触发中断,cpu根据这个编号执行相关的中断处理程序,这些程序是可编程的。
中断有可屏蔽的和不可屏蔽的
可屏蔽中断又分为有选择的屏蔽和全局屏蔽,前者通过中断控制器编程,后者通过CPU的Eflags标志位,关中断时不响应任何请求。
以上是中断在硬件层面的简单介绍,下面是软件层面。
中断描述符表(IDT)
此表在内核初始化时跟着初始化,有256项目,对应中断号,每项8个字节大小,共2KB,每个中断或异常向量在表中有相应的中断或
异常处理程序的入口地址。该表的物理基地址存在idtr寄存器里,表项内容如下
每个表项存有对应中断处理程序的cs和eip,cs是段描述符,还需要配合gdtr寄存器的段表基址,找出处理程序所在段的起始地址,再结合eip这个偏移量找出处理程序的逻辑地址。
软件层面中断产生和处理
当执行了一条指令后, cs和eip这对寄存器包含了下一条将要执行的指令的逻辑地址。
在执行这条指令之前, CPU控制单元会检查在运行前一条指令时是否发生了一个中断或者异常。
如果发生了一个中断或异常, 那么CPU控制单元执行下列操作:
- 确定中断向量。
- 利用中断向量在IDT中找到对应中断门,在中断门中得到段选择符从而可以从GDT中找到中断服务例程的段基址。
- 确定中断发生的特权级合法(linux只有内核态和用户态两种特权级,此步用来检查中断程序的特权是否低于引起中断的程序的特权,低优先级程序不能引起高优先级程序)
- 检查是否发生特权级变化(用户态陷入内核态,这时候需要设置内核的堆栈),如果发生读取当前程序的tss段(通过tr寄存器读取)来选择新特权级的ss和esp指针,然后保存旧的ss和esp指针。
- 若发生的是故障,用引起异常的指令地址修改cs和eip寄存器的值,以使得这条指令在异常处理结束后能被再次执行。
- 在栈中保存eflags、cs和eip的内容。
- 如果异常产生一个硬件出错码,则将它保存在栈中。
- 装载cs和eip寄存器,其值分别是IDT表中第i项门描述符的段选择符和偏移量字段。这对寄存器值给出中断或者异常处理程序的第一条指定的逻辑地址。
此时进程内核堆栈
中断或者异常返回:
-
用保存在栈中的值装载cs、eip和eflags寄存器。如果一个硬件出错码曾被压入栈中, 那么弹出这个硬件出错码。
-
检查被中断进程在被中断的时候是内核态还是用户态)若内核态,iret终止执行;否则,转入3。
-
从栈中装载ss和esp寄存器。这步意味着返 回到与旧特权级相关的栈.
1.进程管理
一个进程的上下文(context)包括进程的状态、有关变量和数据结构的值、机器寄存器的值和PCB以及有关程序、数据等。
一个进程的执行是在进程的上下文中执行。
当正在执行的进程由于某种原因要让出处理机时,系统要做进程上下文切换,以使另一个进程得以执行。
当进行上下文切换时系统要首先检查是否允许做上下文切换(在有些情况下,上下文切换是不允许的,例如系统正在执行某个不允许中断的原语时)。然后,系统要保留有关被切换进程的足够信息,以便以后切换回该进程时,顺利恢复该进程的执行。在系统保留了CPU现场之后,调度程序选择一个新的处于就绪状态的进程、并装配该进程的上下文,使CPU的控制权掌握在被选中进程手中。
系统调用的过程:
- 应用程序 代码调用系统调用( xyz ),该函数是一个包装系统调用的 库函数 ;
- 库函数 ( xyz )负责准备向内核传递的参数,并触发 软中断 以切换到内核;
- CPU 被 软中断 打断后,执行 中断处理函数 ,即 系统调用处理函数 ( system_call);
- 系统调用处理函数 调用 系统调用服务例程 ( sys_xyz ),真正开始处理该系统调用。
进程的切换
- 保存push rbp,将prev进程的rbp的值压栈
- 把rsp的值保存到它自己的sp变量中
- 之后将next进程的sp变量中的值赋给rsp寄存器(完成栈帧的转换)
- 并保存prev进程的rip
- 随后压栈next进程的ip,也即$1(这里已经是在next的栈帧中操作了)
- 这之后return, 也就是pop next进程的rip,执行next进程也就是$1后面的语句
- pop rbp,将rbp指向next进程的栈底
课程心得体会:
这门课从硬件到软件,从用户级到内核级,整体上介绍了linux中比较重要的几个概念,进程管理,内存管理,中断,文件系统。从课上讲解到课后作业,从理论学习到动手实践,不断地失败不断地总结然后进步,最终让我对linux有了一个初步的认识,起步难,后面也难,但是克服困难带来的喜悦会更多,希望今后老师能细化作业的粒度。感谢老师几个月来的辛苦付出!
以上是关于课程学习总结报告的主要内容,如果未能解决你的问题,请参考以下文章