中断机制

    中断分为非屏蔽中断和屏蔽中断。异常又分为故障和陷阱。

    异常的向量和非屏蔽中断的向量和是固定的,而屏蔽中断的向量可以通过对中断控制器的编程来改变。Linux对256个向量的分配如下:

    1、从0~31的向量对应于异常和非屏蔽中断。

    2、从32~47的向量(即由I/O设备引起的中断)分配给屏蔽中断。

    3、剩余的从48~255的向量用来标识软中断。Linux只用了其中的一个(即128或者0x80向量)用来实现系统调用。当用户态下的进程执行一条int 0x80汇编指令时,CPU就切换到内核态,并开始执行system_call( )内核函数。


    异常又分为故障和陷阱,故障和陷阱的区别是发生故障,执行完故障处理函数,程序会继续执行发生故障时的指令。但是发生陷阱,程序会执行发生陷阱的下一条指令,这点来中断类似。

    IF=0,只表示禁止屏蔽中断,并不禁止非屏蔽中断,异常和软中断。可以理解软中断也是异常的一种。


    中断门:其类型码为110,中断门包含了一个中断包含了一个中断或者异常处理程序所在段的选择符和段内偏移量。当控制权通过中断门进入中断处理程序时,处理器清IF标志,即关中断,以避免中断嵌套。中断门中的DPL为0。因此,用户态的进程不能访问Intel的中断门。所有的中断处理程序都由中断门激活,并全部限制在内核态。

    陷阱门:其类型码是111,与中断门类似,其唯一的区别是,控制权通过陷阱门进入处理程序时维持IF标志位不变,也就是说,不关中断。

    系统门:这是Linux内核特别设置的,用来让用户态的进程访问Intel的陷阱门,因此,门描述符的DPL为3。通过系统门来激活4个Linux异常处理函数,它们的向量是3,4,5及128,也就是说,在用户态下,可以使用int 3、into、bound及int 0x80四条汇编指令。也是不关中断的。


    通过中断门执行的中断处理函数,由于已经关中断,不会再执行屏蔽中断,也不会再执行异常,因为,

    1、在内核态能触发的唯一异常就是缺页异常,但中断处理程序从不执行可以导致缺页的操作。

    2、大部分异常发生在用户态,中断处理程序处于内核态。

   

    通过陷阱门执行的中断处理函数,由于未关中断,可能执行屏蔽中断。例如说,因CPU的页面异常而进入服务程序时,中断多半是开着的,如Linux2.4中handle_mm_fault()等等,都是可中断的。此外set_system_gate()所设置的也是陷阱门,所以系统调用也是可中断的。


    所以一个进程,要么在执行用户程序,要么通过异常和软中断陷入内核态,也就说进程执行期间,如果没有发生屏蔽中断,都是可以响应中断的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值