• 中断


    操作系统是中断驱动的.

    1 中断分类

    中断分为:

    1. 外部中断

      指来自cpu外部的中断

      外部中断必须是某个硬件,因此外部中断又称为硬件中断.

    2. 内部中断

      1. 软中断

        由软件主动引起的中断,因为他来自软件内部因此称之为软终端.

        软终端是软件运行达到某个条件引发的,并不属于某种内部错误.因此受到if位的影响

        可以引发中断的指令有,

        1. int8位立即数

          可以表示256中中断

        2. into 中断移除指令.

        3. bound 数组越界指令

        以上是集中软中断的指令

      2. 异常

        是指令执行期间cpu内部产生错误引起的.

        是运行时的错误,因此不受ip位影响.

        1. 除0

        2. 无法识别的机器码 6号中断

        异常又分为三种:

        1. fault 故障

          这种错误可以被修复.最轻的一种异常.

          当发生故障的时候,调用中断处理程序,返回时.cpu讲返回地址日就只想导致fault的那条指令.

          缺页异常就是故障

        2. trap 陷阱

          int3调试

          int 3是调试断点指令.

          原理是父进程修改了紫禁城的指令,在中断出使用int3指令替换.父进程讲被调试进程短浅其实地址的第一个字节备份号之后,替换掉.回复调试的时候讲之前备份的1字节还原到断点处.

        3. abort 终止

          无法修复的故障,程序无法继续运行.系统讲程序中介.

    某些异常会有错误吗,在进入中断的时候cpu会将他们压入栈中.

    只要是关系到操作系统正常运行的草屋if位就不会起作用,因此不可屏蔽中断和异常都不受if位影响.

    为了让cpu获得每个外部设备的中断信号,同时不增加cpu体积,因此cpu提供了两条信号线,INTR和NMI.

    INTR接受的中断都不是影响系统运行的,可以随时处理.甚至可以不处理

    NMI引脚收到的中断是没有必要在处理下去的.需要停机的

    可屏蔽中断值得是INTR引脚进入cpu的.可屏蔽中断意思是外部设备的中断,cpu可以不理会,因为他不会让系统宕机,因此eflgs的if为可以讲intr引脚的外部设备中断屏蔽.

    中断的上半部分和下半部分

    操作系统是中断驱动的,中断发生后会执行中断处理程序,cpu中断响应事件越短越好,这样便能相应更多设备终端.为了提高中断相应效率.于是讲中断处理程序分文上半部分和下半部分.把中断处理程序中需要立即执行的部分放在上半部分,这部分显示执行,在关中断的情况下执行.而不紧急的部分推迟到下半部分执行. 下半部分是开中断的.

    不可屏蔽中断的原因在与中断问题太大了,要宕机,屏蔽不了,例如断电,等.

    中断机制的本质

    中断机制的本质是来了一个中断信号后,调用相应中断处理程序,因此cpu不管有多少种中断,为了同一中断管理,把来自外部设备,内部指令的各种中断类型统统归结为一种管理方式,每个中断信号分配一个证书,用此证书作为中断id,而这个整数就是中断向量.然后次id作为中断描述符表中的索引,这样就能找到对应的表项.从而找到对应的中断处理程序.

    2 中断描述符表

    异常和不可屏蔽中断的中断向量号由cpu自动提供.

    外部设备的可屏蔽中断由中断带起李彤,软终端由软件提供

    中断描述符表IDT是在保护模式下用于存储中断处理程序入口的表,

    bios模式下也有中断.使用的是中断向量表IVT.

    两者的却别在于:

    1. 中断描述符表地址不限制,在哪里都可以

    2. 中断描述符表每个表项8字节.

    IDT中的描述符成为门,门描述符

    所有的描述符都是8字节.主要有调用么内核中断门,陷阱们.任务门

    1. 任务门

      硬件提供的一种任务切换机制,配合任务门中的tss选择子

      可在IDTGDTLDT

    2. 中断门

      通过此方式进入中断后,if位为0,表示中断关闭,避免嵌套

      linux使用中断门实现系统调用 int0x80

      只在IDT中

    3. 陷阱门

      if不设置0,只存在与IDT中.

    4. 调用门

      给同于进程进如特权0的方式,不能使用int,只能使用call和jmp

      在GDT和LDT中

    一个终端元能产生一个中断向量,每个中断向量对应中断描述符表中一个们描述符.

    idtr寄存器中存储表的基址和长度.

    高32位为基址,低16位为长度

    lidt [48]
    

      

    7.3 中断处理过程及保护

    cpu外:外部设备的中断程序有中断代理芯片接受,处理后讲中断的中断向量号发送给cpu

    cpu内:cpu执行该中断向量号对应的中断处理程序

    1. 处理器根据中断向量号找到对应的门描述符

      中断向量号是对终端描述符的苏音,当处理器收到一个外部中断向量号以后,用该想狼嚎在中断描述符表中查找对应的中断描述符,然后执行中断描述符中的中断处理程序.

    2. 处理器进行特权级检查

      有序中断是通过中断向量号通知处理器,中断向量号是一个整数,其中没有rpl,所以对又中断引起的特权级转移做特权检查中,并不涉及RPL.中断门的特权检查同调用门类似,对于软件主动引起的软终端,当前特权级cpl必须在门描述符dpl和门中目标代码段dpl之间.这是为了防止位于3特权级下的用户程序主动调用某些为内核服务的例程.

      主要是门描述符的dpl高.

    3. 中断上下文

      中断向量号找到中断描述符以后,cpl和dpl比较,如果特权级转移,那么需要讲当前特权级保存,cpu先保存当前旧堆栈的ss和sp,然后从tss中取出对应特权级的栈指针加载到ss和sp,然后将旧的栈指针ss和sp压入.然后压入flags寄存器值.

      然后根据需要压入error_code.

      然后压入cs和ip寄存器的值

      注意,这里并不保存其他通用寄存器.

    4. 执行中断处理程序

      讲们描述符目标代码段选择子加载到代码寄存器cs中,吧们描述符中断处理程序的偏移地址加载到ip,开始执行中断处理程序.

    5. 当中断处理程序执行到iret时,首先检查特权级如果符合规则,弹出cs和ip,弹出flages,然后弹出sp和ss

      然后error_code需要手动弹出.

    中断发生后,nt和tf为被置0,如果是中断门,陷阱们或是任务门,if自动被置0.避免嵌套.如果中断发生时对应的描述符是任务门或是陷阱们if位不置0 .陷阱么你主要用于调试,任务门主要用于切换任务.

    iret指令用于从栈中弹出寄存其到cs,ip和flags寄存器.根据特权级是否改变,判断是否需要变换栈.

  • 相关阅读:
    SpringCloud框架介绍
    JMX的介绍
    idea下的terminal中设置git的bash
    利用kafka自带的zookeeper搭建kafka集群
    gRPC教程
    C#使用LINQ查询集合
    C# winform 更换电脑桌面壁纸
    SQL注入攻击
    UML
    C#非对称加密解密(DEC加密算法)
  • 原文地址:https://www.cnblogs.com/perfy576/p/8594203.html
Copyright © 2020-2023  润新知