码迷,mamicode.com
首页 > 其他好文 > 详细

课程学习总结报告

时间:2020-07-08 23:13:23      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:cpu   处理程序   装系统   nbsp   段描述符   课程学习   info   字段   不能   

中断的简要介绍:

中断的出现是为了解决cpu和外设I/O之间速度不匹配的问题,硬件上每个外设都会连接一个设备管理器,该管理器连接中断处理器,再连cpu,如图所示


技术图片每个能够发出中断请求的硬件设备控制
器都有一条称为IRQ(Interrupt ReQuest)的输出线。所有的IRQ线都与一个中断控制器的输入

引脚相连,中断控制器与CPUINTR引脚相连,有很多IRQ线连接在中断控制器上,所以需要编号,中断处理器通过数据总线把编号传给cpu,接着通过INTR触发中断,cpu根据这个编号执行相关的中断处理程序,这些程序是可编程的。

中断有可屏蔽的和不可屏蔽的

可屏蔽中断又分为有选择的屏蔽和全局屏蔽,前者通过中断控制器编程,后者通过CPU的Eflags标志位,关中断时不响应任何请求。

以上是中断在硬件层面的简单介绍,下面是软件层面。

中断描述符表(IDT)

此表在内核初始化时跟着初始化,有256项目,对应中断号,每项8个字节大小,共2KB,每个中断或异常向量在表中有相应的中断或

异常处理程序的入口地址。该表的物理基地址存在idtr寄存器里,表项内容如下

技术图片

 

 

 每个表项存有对应中断处理程序的cs和eip,cs是段描述符,还需要配合gdtr寄存器的段表基址,找出处理程序所在段的起始地址,再结合eip这个偏移量找出处理程序的逻辑地址。

软件层面中断产生和处理

当执行了一条指令后, cseip这对寄存器包含了下一条将要执行的指令的逻辑地址。

在执行这条指令之前, CPU控制单元会检查在运行前一条指令时是否发生了一个中断或者异常。 

如果发生了一个中断或异常, 那么CPU控制单元执行下列操作: 

 

  1. 确定中断向量。
  2. 利用中断向量在IDT中找到对应中断门,在中断门中得到段选择符从而可以从GDT中找到中断服务例程的段基址。
  3. 确定中断发生的特权级合法(linux只有内核态和用户态两种特权级,此步用来检查中断程序的特权是否低于引起中断的程序的特权,低优先级程序不能引起高优先级程序)
  4. 检查是否发生特权级变化(用户态陷入内核态,这时候需要设置内核的堆栈),如果发生读取当前程序的tss段(通过tr寄存器读取)来选择新特权级的ss和esp指针,然后保存旧的ss和esp指针。
  5. 若发生的是故障,用引起异常的指令地址修改cs和eip寄存器的值,以使得这条指令在异常处理结束后能被再次执行。
  6. 在栈中保存eflags、cs和eip的内容。
  7. 如果异常产生一个硬件出错码,则将它保存在栈中。
  8. 装载cs和eip寄存器,其值分别是IDT表中第i项门描述符的段选择符和偏移量字段。这对寄存器值给出中断或者异常处理程序的第一条指定的逻辑地址。

 

 此时进程内核堆栈

技术图片

 

 

 

 

 

中断或者异常返回:

  1. 用保存在栈中的值装载cs、eip和eflags寄存器。如果一个硬件出错码曾被压入栈中, 那么弹出这个硬件出错码。

  2. 检查被中断进程在被中断的时候是内核态还是用户态)若内核态,iret终止执行;否则,转入3。

  3. 从栈中装载ss和esp寄存器。这步意味着返 回到与旧特权级相关的栈.

 

 1.进程管理

一个进程的上下文(context)包括进程的状态、有关变量和数据结构的值、机器寄存器的值和PCB以及有关程序、数据等。

一个进程的执行是在进程的上下文中执行。

当正在执行的进程由于某种原因要让出处理机时,系统要做进程上下文切换,以使另一个进程得以执行。

当进行上下文切换时系统要首先检查是否允许做上下文切换(在有些情况下,上下文切换是不允许的,例如系统正在执行某个不允许中断的原语时)。然后,系统要保留有关被切换进程的足够信息,以便以后切换回该进程时,顺利恢复该进程的执行。在系统保留了CPU现场之后,调度程序选择一个新的处于就绪状态的进程、并装配该进程的上下文,使CPU的控制权掌握在被选中进程手中。

系统调用的过程

 技术图片

  

    1. 应用程序 代码调用系统调用( xyz ),该函数是一个包装系统调用的 库函数 ;
    2. 库函数 ( xyz )负责准备向内核传递的参数,并触发 软中断 以切换到内核;
    3. CPU 被 软中断 打断后,执行 中断处理函数 ,即 系统调用处理函数 ( system_call);
    4. 系统调用处理函数 调用 系统调用服务例程 ( sys_xyz ),真正开始处理该系统调用。

 

进程的切换

 

技术图片

 

 

 

  1. 保存push rbp,将prev进程的rbp的值压栈
  2. 把rsp的值保存到它自己的sp变量中
  3. 之后将next进程的sp变量中的值赋给rsp寄存器(完成栈帧的转换)
  4. 并保存prev进程的rip
  5. 随后压栈next进程的ip,也即$1(这里已经是在next的栈帧中操作了)
  6. 这之后return, 也就是pop next进程的rip,执行next进程也就是$1后面的语句
  7. pop rbp,将rbp指向next进程的栈底

 

课程心得体会:

  这门课从硬件到软件,从用户级到内核级,整体上介绍了linux中比较重要的几个概念,进程管理,内存管理,中断,文件系统。从课上讲解到课后作业,从理论学习到动手实践,不断地失败不断地总结然后进步,最终让我对linux有了一个初步的认识,起步难,后面也难,但是克服困难带来的喜悦会更多,希望今后老师能细化作业的粒度。感谢老师几个月来的辛苦付出!

课程学习总结报告

标签:cpu   处理程序   装系统   nbsp   段描述符   课程学习   info   字段   不能   

原文地址:https://www.cnblogs.com/gfsh/p/13269663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!