中断

操作系统是中断驱动的.

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寄存器.根据特权级是否改变,判断是否需要变换栈.

原文地址:https://www.cnblogs.com/perfy576/p/8594203.html