• 现代操作系统-操作系统运行环境与运行机制


    ---恢复内容开始---

    应用程序

    ------------------- 虚拟机器界面

    操作系统

    -----------------物理机器界面

    硬件

    操作系统的运行环境为 1.CPU状态2.中断/异常机制

    操作系统运行机制: 系统调用

    处理器状态与模式

    CPU由运算器,控制器,寄存器,高速缓存构成

    寄存器分为:

    用户可见寄存器:用于优化算法分配使用的

    控制和状态寄存器:用于控制处理器操作,由操作系统使用

    一般的控制状态寄存器可以在某种特级权别控制处理器操作,常见的控制和状态寄存器 程序计数器,指令寄存器,程序状态字(PSW)

    PSW:记录cpu的运行状态,比如条件码,模式,控制位

    操作系统特征:并发,共享,因此,我们需要实现保护与控制

    硬件提供的基本运行机制:

    处理器有特权级别,不同的级别可以使用的指令集合是不同的

    硬件机制可以将os跟用户程序隔离

    现代操作系统通常把cpu的状态分为2-4种,PSW中有一位专门用来控制资源和指令的使用权限

    linux操作系统一般的CPU状态分为2种,用户态跟内核态

    用户态->内核态 中断/异常/陷入机制(一条特色指令,如trap,int,syscall)

    内核态->用户态 设置PSW

    中断:cpu对系统发出的某个事件作出的一种反应

    cpu暂停正在执行的程序,保留现场,自动转去执行相应事件的处理程序,处理完成后返回断电,继续执行被打断的程序

    特点:随机发生,自动处理,可恢复,

    中断/异常机制工作原理

    中断跟异常的不同点

    中断:外部事件,正在运行的程序不期望

    异常:由自己正在执行的指令所引发的

    事件分为:中断跟异常

    中断:I/O中断,时钟中断,硬件故障

    异常:系统调用,页故障,保护性异常等

     中断异常机制工作原理

     硬件: 捕获中断源发出的中断/异常请求 ,以一定方式响应,将处理器控制权交给特定的处理程序

    软件:中断/异常处理程序,识别中断,异常类型,并完成相应处理

     中断响应:发现中断,接收中断的过程,由中断硬件部件完成,中断处理控制部件设有中断寄存器

     cpu响应:在每条指令执行周期的最后时刻扫描中断寄存器,查看是否中断信号,如果有中断,中断硬件将该中断触发器内容按规定编码送入PSW的相应位,称为中断码,通过查中断向量表引出中断处理程序

    中断向量:一个内存单元,存放中断处理程序入口地址跟程序运行时所需的cpu状态字

    (执行流程按照中断号/异常类型的不同,通过中断向量表转移控制权给中断处理程序)

    中断响应示意:

    设备发出中断信号,硬件保护现场(PSW,PC保存在系统堆栈),根据中断码查表,把中断处理程序入口地址等推送到相应的寄存器,执行中断处理程序

    在设计操作系统时,给每一类中断/异常事件编写好相应的处理程序,并设置好中断向量表

    系统运行时,如果响应中断,中断硬件部件将cpu控制权转给中断处理程序:

    保存相关寄存器信息,分析中断/异常的具体原因,执行对应的处理功能,恢复现场,返回被事件打断的程序

    设备输入输出中断为例:

    打印机给cpu发送中断信号,CPU处理当前指令后检测到中断,判断中断来源并且向相关设备发确认信号,,处理器状态切换为内核态

    在系统栈保存:PC,PSW,cpu根据中断码查中断向量表,获得该相关中断的处理程序的入口地址,将PC设置为此地址,新的指令周期开始,CPU控制转移到中断处理程序,中断处理程序开始工作,在系统栈中保存现场信息,检查I/O设备信息,等等之类

    中断处理结束,cpu检测到中断返回指令,从系统栈恢复被中断的上下文,cpu状态恢复为原来的状态,cpu开始一个新的指令周期

    X86对中断/异常的支持

    中断:是硬件信号引发的,可屏蔽和不可屏蔽中断

    异常:指令执行引发的,除以0异常

    系统调用:异常的一种,用户态到内核态的唯一入口

    中断控制器(PIC)负责将硬件的中断信号转为中断向量,引发cpu中断

    采用中断描述符表:用gate描述符数据结构表示中断向量,gate分为任务门,中断门,陷阱门,调用门

     中断/异常的硬件处理过程:

    确定中断/异常关联的向量i;通过IDTR寄存器找到IDT表,获得中断描述符(表中的第i项),从GDRT寄存器获得GDT的地址;结合中断描述符中的段选择符,在GDT表中获得对应的段描述符,从该段描述符中获得中断/异常处理程序所在的段基址,特权级检查,如果发现变化,进行堆栈切换(必须使用与新的特权级相关的栈),保存上下文到栈中,通过中断描述符中的段内偏移量和段描述符中的基地址,找到程序入口地址,执行第一条指令

     系统调用机制

    系统调用:在用户在编程时,可以调用操作系统功能,系统调用的操作系统提供给编程人员的唯一接口,使CPU状态从用户态转为内核态

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

    cpu执行特殊的陷入指令时:

    中断/异常机制:硬件保护现场,通过查中断向量表,控制权转给系统调用入口程序

    系统调用总入口程序:保存现场,将参赛保存在内核栈,通过查系统调用表把控制权转给相应的系统处理历程,执行系统调用历程,恢复现场,返回用户程序

    linux系统调用的实现

    陷入指令选择128号;

    int $0x80

    门描述符,系统初始化,对IDT表的128号门初始化,门描述符的2,3两个字节:内核代码选择符,0,1,6,7四个字节:偏移量(指向system_call())

    门类型:陷阱门

    由于特权级的改变:用户栈->内核栈,cpu从任务状态段TSS中装入新的栈指针,指向内核栈

    用户栈指针,用户态CS,EIP寄存器的内容压栈,用128在IDT中找到该门描述符,从中找到段选择符装入代码段寄存器CS

    ,代码段描述符的基地址+陷阱门描述符中的偏移量->定位systemcall()的入口地址

    . 硬件压栈: 程序计数器等
    2. 硬件从中断向量装入新的程序计数器等
    3. 汇编语言过程保存寄存器值
    4. 汇编语言过程设置新的堆栈
    5. C语言中断服务程序运行(例: 读并缓冲输入)
    6. 进程调度程序决定下一个将运行的进程
    7. C语言过程返回至汇编代码
    8. 汇编语言过程开始运行新的当前进程

    ---恢复内容结束---

  • 相关阅读:
    计划任务
    swap
    fdisk
    raid 搭建
    Http协议中Cookie详细介绍
    linux系统日志以及分析
    搞清楚php-FPM到底是什么?
    Amoeba+Mysql实现数据库读写分离
    Last_SQL_Error: Error 'Can't drop database 'ABC'; database doesn't exist' on query. Default database: 'ABC'. Query: 'drop database ABC'
    MySQL主从失败, 错误Got fatal error 1236解决方法
  • 原文地址:https://www.cnblogs.com/zengyiwen/p/4967297.html
Copyright © 2020-2023  润新知