Week2-操作系统运行环境-Coursera北大操作系统课程-个人笔记


  声明:本文的图片和内容均来自Coursera课堂。

1.处理器状态

1.1 中央处理器(CPU)的组成

  CPU由运算器、控制器、一系列的寄存器以及高速缓存构成。
  上述一系列寄存器通常包括两类寄存器:
  1).用户可见寄存器
  高级语言编译器通过优化算法分配并使用之,以减少程序访问内存次数。
  2).控制和状态寄存器
  用于控制处理器的操作,通常由操作系统代码使用。

1.2 控制和状态寄存器介绍

  控制和状态寄存器是用于控制处理器的操作,并在某种特权级别下可以进行访问和修改的寄存器。
  常见的控制和状态寄存器有:
  1).程序计数器(PC, Program Counter)
  记录将要取出的指令的地址。
  2).指令寄存器(IR, Instruction Register)
  记录最近取出的指令。
  3).程序状态字(PSW, Program Status Word)
  记录处理器的运行状态,如条件码、模式、控制位等信息。

  从操作系统的特征出发,操作系统具有“并发、共享”的特征,因此,需要要求操作系统提供保护与控制的功能(保护、控制什么?应该是硬件地址中数据的读取)。
  所以,需要硬件(CPU)提供基本的运行机制:
  1).处理器具有特权级别,能在不同的特权级运行的不同指令集合,例如X86系列处理器就具有R0,R1,R2,R3四个特权级别,其中R0基本权力最高;R3最低;其他R1,R2级别则介于两者之间。不同级别能够允许的指令集合不同。目前大多数基于X86处理器的系统只用了R0和R3两个级别。
  2).硬件机制可将OS与用户程序隔离。

  处理器的状态
  现代处理器通常将CPU状态设计划分为两种、三种或四种。
  在程序状态字寄存器PSW中专门设置一位,根据运行程序对资源和指令的使用权限而设置不同的CPU状态。例如下图中的X86架构中的EFLAGS寄存器,其中的第12、13位就是控制当前运行程序的特权级别,两位共可以表示4种处理器状态。
在这里插入图片描述

1.3 特权指令和非特权指令

  操作系统需要两种CPU状态:
  1).内核态(Kernel Mode)
  运行操作系统程序。例如X86系列中的R0特权级别,相当于内核态。
  2).用户态(User Mode)
  运行用户程序。例如X86系列中的R3特权级别,相当于用户态。

  特权指令:只能由操作系统使用、用户程序不能使用的指令。
  例如:启动I/O、内存清零、修改程序状态字、设置时钟、允许/禁止中断、停机等。
  非特权指令:用户程序可以使用的指令。
  例如:控制转移(具体指什么?)、算术运算、访管指令(也叫陷入指令)、取数指令等。
  其中,访管指令(又称陷入指令)是一条特殊的非特权指令,它是提供给用户程序的接口,用于调用操作系统的功能(也就是间接调用内核态指令的接口)。因为内核态也被称为管理员模式(Supervisor mode),所以这种访问管理员模式的指令称为访管指令。例如:int、trap、syscall、sysenter/sysexit等。

1.4 CPU状态之间的转换

  1).用户态→内核态
  唯一途径:利用中断/异常/陷入机制。

  2).内核态→用户态
  设置程序状态字PSW。

2. 中断与异常机制

2.1 中断/异常的概念及重要性

  中断/异常:CPU对系统发生的某个事件做出的一种反应。CPU暂停正在执行的程序,保留现场(即放下当前正在执行的任务并保留)后,自动转去执行相应事件的处理程序(即中断/异常触发的事件),处理完成后返回断点继续执行被打断的程序。
  可以说,中断的产生(某个事件的发生)改变了处理器的控制流(也就是执行任务的顺序)。

  中断/异常的特点:
  1).是随机发生的;
  2).是自动处理的;
  3).是可恢复的(对于中断前的任务来说)。

  中断/异常的主要作用:
  1).能及时处理设备发来的中断请求;
  2).可使OS捕获用户程序提出的服务请求;
  3).防止用户程序执行过程中的破坏性或违背原则的活动等等。

  中断与异常的区别:
  中断也成为外中断,是由外部设备引起的事件导致的,比如I/O设备产生中断、时钟定时产生中断、硬件故障产生中断等等。是正在运行的程序所无法预料的。
  异常也称为内中断,是由内部事件引起的。所谓内部事件,也就是当前CPU执行的任务(代码段)产生的事件。比如程序进行系统调用、指令执行时产生的页故障(缺页异常)/页错误、代码的保护性异常、编译器的断点以及其他异常(如访问地址出错、算术溢出等等)。是由正在执行的指令所引发的。

  中断/异常机制相当于是汽车中的发动机、飞机中的引擎,是操作系统的动力源。可以说,操作系统是由“中断驱动”或者是“事件驱动”的。

2.2 为什么引入中断与异常?

  1).中断的作用
  为了支持CPU和设备之间的并行操作。
  比如,当CPU启动设备执行I/O任务后,I/O设备就可以独立完成后续I/O任务,而CPU就可以去处理其他不相关的任务;当I/O设备完成任务后,触发中断,向CPU报告此次I/O任务的结果,让CPU决定如何处理后续的事情。

  2).异常的作用
  表示CPU执行指令时本身出现的问题。
  比如代码段出现算术溢出、除零、取数时的奇偶校验错误、访问地址时越界或者代码段执行了“访管指令”等等。此时由于异常的发生,CPU停止当前的任务,转而去执行相应的异常处理程序,或者是执行系统调用指令等。

2.3 中断与异常的小结

类别原因异步/同步返回行为
中断来自I/O设备等外部硬件异步总是返回到下一条指令
陷入trap有意识安排的同步返回到下一条指令
故障fault可恢复的错误同步返回到当前指令
终止abort不可恢复的错误同步不会返回

2.4 中断/异常机制工作原理

  中断/异常时,硬件该做什么?
  捕获中断源发出的中断/异常请求,以一定方式进行中断/异常响应(即做一些对应动作,下简称中断响应),将处理器控制权交给特定的处理程序。
  发现中断、接受中断的过程由中断硬件部件完成,这个过程叫做中断响应。

  软件(即操作系统或CPU正在执行的软件)该做什么?
  识别中断/异常类型并完成相应的处理。(即执行中断/异常处理程序)

  CPU何时响应中断?
在这里插入图片描述
  CPU处理器控制部件中设有中断寄存器。如果当前CPU状态是允许中断的,那么在CPU正常执行程序的每条指令的最后,会扫描一些中断寄存器,查看是否有中断信号。如果有中断信号,则中断硬件将该中断触发器内容按规定编码送入PSW的相应位,称为中断码。通过查询中断向量表,引出中断处理程序。
  中断向量是一个内存单元,里面存放中断处理程序入口地址程序运行时所需的处理机状态字
  而中断向量表就是储存上述所有中断向量信息的单元总和。
  对于操作系统的设计来说,在设计操作系统时,需要为每一类中断/异常事件编写好相应的处理程序,并设置好中断向量表。
  下图是Linux中的中断向量表说明:
在这里插入图片描述
  下图是中断响应的具体流程示意图:
在这里插入图片描述
  设备(打印机)输入输出中断通常由两类,一类是I/O操作正常结束;另一类是I/O操作出现错误,通常会进行反复尝试多次后再触发硬件故障中断。
  以设备(打印机)输入输出中断为例,再总结一下中断响应的过程:
  1).打印机接受中断,给CPU发送中断信号;(硬件)
  2).CPU处理完当前指令后检测到中断信号,判断出中断来源并向相关设备发送确认信号;(硬件)
  3).CPU开始为软件处理中断做准备:a.处理器状态被切换到内核态;b.在系统栈中保存被中断程序的重要上下文环境,主要是程序计数器PC和程序状态字PSW。(硬件)
  4).CPU根据中断码查询中断向量表,获得与该中断相关的处理程序的入口地址,并将PC设置成该地址,新的执行周期开始时,CPU控制劝转移到中断处理程序。(硬件)
  5).中断处理程序开始工作:a.在系统栈中保存现场信息;b.检测I/O设备的状态信息,操作I/O设备或者在设备和内存之间传送数据等等。(软件)
  6).中断处理结束时,CPU检测到中断返回指令,从系统栈中恢复被中断程序的上下文环境,CPU状态恢复成原来的状态,PSW和PC恢复成中断前的值,CPU开始继续之前的工作。(硬件)
  总结来说,就是软件提前设置好,硬件部件来执行。

2.5 中断/异常处理的实例——X86处理器

 &#8195**;I. X86处理器的基础信息**
  1).中断控制器(PIC或APIC)
  负责将硬件的中断信号转换为中断向量,并引发CPU中断。
  2).实模式:中断向量表(Interrupt Vector)
  存放中断服务程序的入口地址:
  i. 入口地址=段地址左移4位+偏移地址;
  ii. 不支持CPU运行状态的切换;
  iii. 中断处理与一般的过程调用相似。
  3).保护模式:中断描述符表(Interrupt Descriptor Table)
  采用门(gate)描述符数据结构表示中断向量。共有4中类型的门描述符:
  i. 任务门;
  ii. 中断门:给出段选择符、中断/异常程序的段内偏移量,通过中断门后系统会自动禁止中断;
  iii. 陷阱门:与中断门类似,但通过陷阱门后不会自动禁止中断;
  iv. 调用门

  (下述过程中有些初学者不太熟悉的名词和过程,可以暂时先跳过,主要了解中断相关的部分即可)
  II. X86处理器处理中断的过程
  1).确定与中断或异常关联的向量i;
  2).通过IDTR(中断描述符表寄存器)找到IDT表,获得中断描述符;
  3).从GDTR(全局描述符表寄存器)获得GDT的地址,结合中断描述符中的段选择符,在GDT表获取对应的段描述符;从该段描述符中得到的中断或异常处理程序所在的段基址;
  4).特权级检查,是否发生特权级的变化。如果是,则进行堆栈切换(用与特权级对应的堆栈);
  5).硬件压栈,保存上下文环境;如果异常产生了硬件出错码,也保存在栈中。
  6).如果是中断,清IF位;
  7).通过中断描述符中的段内偏移量和段描述符中的基地址,找到中断/异常处理程序的入口地址,执行其第一条指令。
  图示如下图。
在这里插入图片描述

3.系统调用(System Call)机制

3.1 系统调用的概念及作用

  “系统调用”的概念:是操作系统向用户提供的接口,是用户在编程时可以调用的操作系统功能。
  “系统调用”的作用:系统调用是操作系统提供给编程人员的唯一接口;系统调用会使CPU状态从用户态陷入内核态。
  “系统调用”的典例:进程控制、进程通信、文件使用、目录操作、设备管理、信息维护等。

3.2 系统调用、库函数、APU和内核函数的关系

  系统调用是外部使用内核函数的唯一接口,通常用户开发的应用程序是直接调用C函数库或API接口,再间接使用系统调用来使用内核函数的;当然,有些应用程序也会直接使用系统调用,但是这样代码就非常底层了。关系图如下:
在这里插入图片描述

3.3 系统调用机制的设计

  1).通过中断/异常机制,支持系统调用服务的实现;
  2).选择一条特殊指令:如访管指令(陷入指令),引发异常,完成用户态到内核态的切换;
  3).系统调用号和参数:每个系统调用都事先给定一个编号(功能号);
  4).系统调用表,存放系统调用服务例程的入口地址。

  如何将用户程序的参数传递给内核?
  1).由陷入指令自带参数
由于陷入指令的长度有限,且还要携带系统调用功能号,只能自带有限的参数;
  2).通过通用寄存器传递参数
最常用的方法。这些寄存器是操作系统和用户程序都能访问的,但寄存器的个数会限制传递参数的数量;
  3).在内存中开辟专用堆栈区来传递参数

3.4 系统调用机制的运行过程

  当CPU执行到特殊的陷入指令时:
  1).触发中断/异常机制:硬件保护现场;通过查中断向量表把控制权转给系统调用总入口程序;
  2).系统调用总入口程序:保存现场;将参数保存在内核堆栈里;通过查系统调用表把控制权转给相应的系统调用处理例程或内核函数;
  3).执行系统调用例程;
  4).恢复现场,返回用户程序;

4.本章总结

  • 理解计算机系统的保护机制
    • 掌握处理器状态
    • 掌握特权指令与非特权指令
  • 掌握中断/异常机制
    • 掌握中断/异常的基本概念
    • 理解中断/异常机制的工作原理
  • 掌握系统调用机制
    • 掌握系统调用设计原理
    • 掌握系统调用执行过程
  • 本章重点概念:CPU状态、内核态/用户态、特权指令/非特权指令、中断/异常、中断响应、中断向量、中断处理程序、系统调用、陷入指令、系统调用号、系统调用表等。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值