ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

课程学习总结报告

2020-07-08 22:41:39  阅读:269  来源: 互联网

标签:总结报告 中断 学习 cs 课程 内核 寄存器 进程 CPU


中断的简要介绍:

中断的出现是为了解决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控制单元执行下列操作: 

 

  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有了一个初步的认识,起步难,后面也难,但是克服困难带来的喜悦会更多,希望今后老师能细化作业的粒度。感谢老师几个月来的辛苦付出!

标签:总结报告,中断,学习,cs,课程,内核,寄存器,进程,CPU
来源: https://www.cnblogs.com/gfsh/p/13269663.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有