操作系统是中断驱动的.
1 中断分类
中断分为:
-
外部中断
指来自cpu外部的中断
外部中断必须是某个硬件,因此外部中断又称为硬件中断.
-
内部中断
-
软中断
由软件主动引起的中断,因为他来自软件内部因此称之为软终端.
软终端是软件运行达到某个条件引发的,并不属于某种内部错误.因此受到if位的影响
可以引发中断的指令有,
-
int8位立即数
可以表示256中中断
-
into 中断移除指令.
-
bound 数组越界指令
以上是集中软中断的指令
-
-
异常
是指令执行期间cpu内部产生错误引起的.
是运行时的错误,因此不受ip位影响.
-
除0
-
无法识别的机器码 6号中断
异常又分为三种:
-
fault 故障
这种错误可以被修复.最轻的一种异常.
当发生故障的时候,调用中断处理程序,返回时.cpu讲返回地址日就只想导致fault的那条指令.
缺页异常就是故障
-
trap 陷阱
int3调试
int 3
是调试断点指令.原理是父进程修改了紫禁城的指令,在中断出使用int3指令替换.父进程讲被调试进程短浅其实地址的第一个字节备份号之后,替换掉.回复调试的时候讲之前备份的1字节还原到断点处.
-
abort 终止
无法修复的故障,程序无法继续运行.系统讲程序中介.
-
-
某些异常会有错误吗,在进入中断的时候cpu会将他们压入栈中.
只要是关系到操作系统正常运行的草屋if位就不会起作用,因此不可屏蔽中断和异常都不受if位影响.
为了让cpu获得每个外部设备的中断信号,同时不增加cpu体积,因此cpu提供了两条信号线,INTR和NMI.
INTR接受的中断都不是影响系统运行的,可以随时处理.甚至可以不处理
NMI引脚收到的中断是没有必要在处理下去的.需要停机的
可屏蔽中断值得是INTR引脚进入cpu的.可屏蔽中断意思是外部设备的中断,cpu可以不理会,因为他不会让系统宕机,因此eflgs的if为可以讲intr引脚的外部设备中断屏蔽.
中断的上半部分和下半部分
操作系统是中断驱动的,中断发生后会执行中断处理程序,cpu中断响应事件越短越好,这样便能相应更多设备终端.为了提高中断相应效率.于是讲中断处理程序分文上半部分和下半部分.把中断处理程序中需要立即执行的部分放在上半部分,这部分显示执行,在关中断的情况下执行.而不紧急的部分推迟到下半部分执行. 下半部分是开中断的.
不可屏蔽中断的原因在与中断问题太大了,要宕机,屏蔽不了,例如断电,等.
中断机制的本质
中断机制的本质是来了一个中断信号后,调用相应中断处理程序,因此cpu不管有多少种中断,为了同一中断管理,把来自外部设备,内部指令的各种中断类型统统归结为一种管理方式,每个中断信号分配一个证书,用此证书作为中断id,而这个整数就是中断向量.然后次id作为中断描述符表中的索引,这样就能找到对应的表项.从而找到对应的中断处理程序.
2 中断描述符表
异常和不可屏蔽中断的中断向量号由cpu自动提供.
外部设备的可屏蔽中断由中断带起李彤,软终端由软件提供
bios模式下也有中断.使用的是中断向量表IVT.
两者的却别在于:
-
中断描述符表地址不限制,在哪里都可以
-
中断描述符表每个表项8字节.
IDT中的描述符成为门,门描述符
所有的描述符都是8字节.主要有调用么内核中断门,陷阱们.任务门
-
任务门
硬件提供的一种任务切换机制,配合任务门中的tss选择子
可在IDTGDTLDT
-
中断门
通过此方式进入中断后,if位为0,表示中断关闭,避免嵌套
linux使用中断门实现系统调用 int0x80
只在IDT中
-
陷阱门
if不设置0,只存在与IDT中.
-
调用门
给同于进程进如特权0的方式,不能使用int,只能使用call和jmp
在GDT和LDT中
一个终端元能产生一个中断向量,每个中断向量对应中断描述符表中一个们描述符.
idtr寄存器中存储表的基址和长度.
高32位为基址,低16位为长度
lidt [48]
7.3 中断处理过程及保护
cpu外:外部设备的中断程序有中断代理芯片接受,处理后讲中断的中断向量号发送给cpu
cpu内:cpu执行该中断向量号对应的中断处理程序
-
处理器根据中断向量号找到对应的门描述符
中断向量号是对终端描述符的苏音,当处理器收到一个外部中断向量号以后,用该想狼嚎在中断描述符表中查找对应的中断描述符,然后执行中断描述符中的中断处理程序.
-
处理器进行特权级检查
有序中断是通过中断向量号通知处理器,中断向量号是一个整数,其中没有rpl,所以对又中断引起的特权级转移做特权检查中,并不涉及RPL.中断门的特权检查同调用门类似,对于软件主动引起的软终端,当前特权级cpl必须在门描述符dpl和门中目标代码段dpl之间.这是为了防止位于3特权级下的用户程序主动调用某些为内核服务的例程.
主要是门描述符的dpl高.
-
中断上下文
中断向量号找到中断描述符以后,cpl和dpl比较,如果特权级转移,那么需要讲当前特权级保存,cpu先保存当前旧堆栈的ss和sp,然后从tss中取出对应特权级的栈指针加载到ss和sp,然后将旧的栈指针ss和sp压入.然后压入flags寄存器值.
然后根据需要压入error_code.
然后压入cs和ip寄存器的值
注意,这里并不保存其他通用寄存器.
-
执行中断处理程序
讲们描述符目标代码段选择子加载到代码寄存器cs中,吧们描述符中断处理程序的偏移地址加载到ip,开始执行中断处理程序.
-
当中断处理程序执行到iret时,首先检查特权级如果符合规则,弹出cs和ip,弹出flages,然后弹出sp和ss
然后error_code需要手动弹出.
中断发生后,nt和tf为被置0,如果是中断门,陷阱们或是任务门,if自动被置0.避免嵌套.如果中断发生时对应的描述符是任务门或是陷阱们if位不置0 .陷阱么你主要用于调试,任务门主要用于切换任务.
iret指令用于从栈中弹出寄存其到cs,ip和flags寄存器.根据特权级是否改变,判断是否需要变换栈.