中断_中断嵌套 - CSDN
中断 订阅
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 [1] 展开全文
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 [1]
信息
应    用
计算机编程
外文名
Interrupt Request
分    类
硬性中断、软性中断
中文名
中断
学    科
计算机
顺    序
高级中断优先
中断术语解释
指处理机处理程序运行中出现的紧急事件的整个过程.程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序中断;当处理机接受中断时,只需暂停一个或几个周期而不执行处理程序的中断,称为简单中断.中断又可分为屏蔽中断和非屏蔽中断两类.可由程序控制其屏蔽的中断称为屏蔽中断或可屏蔽中断.屏蔽时,处理机将不接受中断.反之,不能由程序控制其屏蔽,处理机一定要立即处理的中断称为非屏蔽中断或不可屏蔽中断.非屏蔽中断主要用于断电、电源故障等必须立即处理的情况.处理机响应中断时,不需执行查询程序.由被响应中断源向CPU发向量地址的中断称为向量中断,反之为非向量中断.向量中断可以提高中断响应速度。 [2] 
收起全文
精华内容
参与话题
  • 中断实现的基本原理

    万次阅读 2017-03-12 20:29:58
    中断是计算机发展中一个重要的技术,它的出现很大程度上解放了CPU,提高了CPU的执行效率。 在中断出现之前,CPU对IO采用的是轮询的方式进行服务,这使的CPU纠结在某一个IO上,一直在等待它的响应,如果它不响应,...

    前言:

    中断是计算机发展中一个重要的技术,它的出现很大程度上解放了CPU,提高了CPU的执行效率。

    在中断出现之前,CPU对IO采用的是轮询的方式进行服务,这使的CPU纠结在某一个IO上,一直在等待它的响应,如果它不响应,CPU就在原地一直的等下去。这样就导致了其他IO口也在等待CPU的服务,如果某个IO出现了important or emergency affairs,CPU也抽不出身去响应这个IO。

    为了解决这个纠结的问题就------>出现了中断

    中断控制的主要优点是只有在IO接口需要服务时才去响应它,使得CPU很淡定的做它自己的事情,只有IO口有需求的时候才去响应它。同时中断中也设计了中断优先级,来处理一些很紧急的事件。

    一.中断的基本知识

    1.中断的概念:

    所谓中断,是指CPU在正常运行程序时,由于程序的预先安排或内外部事件,引起CPU中断正在运行的程序,而转到发生中断事件程序中。这些引起程序中断的事件称为中断源。

    其实从 物理学的角度看,中断是一种电信号,由硬件设备产生,并直接送入中断控制器(如 8259A)的输入引脚上,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后, 处理器会通知 OS 已经产生中断。这样,OS 就可以对这个中断进行适当的处理。不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标识,这些值通常被称为中断请求线。

    2.那么 当产生一个中断时,CPU是如何识别的呢?

    在Intel X86中可以支持256中向量中断,为了使处理器能使别每种中断源,给它们进行了编号----->叫做中断向量

    3.这些中断向量在Linux中是如何分配的:

    编号0~31的向量对应于异常和非屏蔽中断

    编号32~47的向量(即由IO设备引起的中断)分配给屏蔽中断。

    编号48~255的向量用来标示软中断。Linux用其中的128或0x80来实现系统调用

    非屏蔽中断的向量和异常的向量是固定的。 

    4.异常和中断的区别:

    1>异常:是指CPU内部出现的中断,即在CPU执行特定指令时出现的非法情况。同时异常也称为同步中断,因此只有在一条指令执行后才会发出中断 ,不可能在指令执行期间发生异常。

    a.产生的原因:

    程序的错误产生的(eg:除数为0)

    内核必须处理的异常条件产生的(eg:缺页)

    b.异常又分为故障和陷阱,它们都不使用中断控制器,也不能被屏蔽

    C.X86处理处理器中大约有20中异常。Linux内核必须为每种异常提供一个专门的异常处理程序。

    2>中断:也称为异步中断。因此它是由其他硬件设备依照 CPU 时钟信号随机产生,即意味着中断能在指令之间发生。

    a.中断又分为外部可屏蔽中断(INTR)和外部非屏蔽中断(NMI)

    所用I0设备产生的中断请求均引起可屏蔽中断

    硬件故障引起的故障则产生非屏蔽中断。

    John说明:

    在CPU执行一个异常处理程序时,就不再响应其他异常和中断请求服务.那么如果此时发生了一个异常,CPU不能去响应它,又不能把它的信息丢失该怎么办呢?

    这是就用到了堆栈,把所有的信息压入栈。等当前异常处理后,才从堆栈中取出信息再响应刚才的异常。(当产生多个非屏蔽中断时,CPU的处理方法同上)

    二APIC和8259A 

    中断的实现也需要硬件上的支持的,那么硬件上是如何支持中断的?

    1.在X86计算机的 CPU 为中断只提供了两条外接引脚:NMI 和 INTR。

    NMI 是不可屏蔽中断,它通常用于电源掉电和物理存储器奇偶校验;

    INTR是可屏蔽中断,可以通过设置中断屏蔽位来进行中断屏蔽,它主要用于接受外部硬件的中断信号,这些信号由中断控制器传递给 CPU。

    2.中断控制器

    目前常见的中断控制器有可编程中断控制器8259A和高级可编程中断控制器(APIC)

    1> 8259A

    PIC(Programmable Interrupt Controller)是由两片 8259A 的外部芯片以“级联”的方式连接在一起。每个芯片可处理多达 8 个不同的 IRQ。因为从 PIC 的 INT 输出线连接到主 PIC 的 IRQ2 引脚,所以可用 IRQ 线的个数达到 15 个。

    我们来看一个图:(进行看图说明)

    a.第一级8259A是主中断控制器,它的第二个中断请求输入端与第二级8259A的中断输出端INT相连。

    b.与中断控制器相连的每条线叫做中断线 。要使用中断线,就要进行中断线的申请,即IRQ。

    那么这条线的名字是啥勒----》中断号。

    IRQ线是从0开始顺序编号的,所以第一条IRQ线就是IRQ0。 

    C.那么该中断号于我们上面所说的中断向量有什么关系呢

    中断向量=中断号+32。

    从此等式可以看出,第一个中断线(IR0)所对应的中中断向量是32.

    由此可以得出:

    (1)异常和非屏蔽向量是CPU 内部引起的中断

    (2)向量32-47对应的是外部中断。

    d.并不是每个设备都可以向中断线上发中断信号,只有对某一条确定的中断线拥有了控制权后,才可以向这条中断线上发送信号。

    e. 8259A中还有一个很重要的寄存器->8位的中断屏蔽寄存器 ->这个寄存器的作用是屏蔽中断。

    8位的中断屏蔽寄存每一位对应8259A中的一条中断线,如果要禁用某条中断线,则把中断屏蔽寄存器的相应位置1,要启用则置0。

    J ohn哥说明:

    屏蔽中断也可以从CPU的角度考虑,即清除eflag的中断标志位(IF),当IF位为0时禁止任何外部IO的中断请求,即关中断; 

    f.共享中断(一个很重要的概念,后面程序中会涉及到它)

    由于计算机的外部设备越来越多,所以15条中断线已经不够用了。中断线是很宝贵的资源,为了更好的利用它,只有当设备需要中断的时候才申请占用一个IRQ,并且为了让更多的设备使用中断采取了在申请IRQ时采用共享中断的方式。

    2>高级可编程中断控制器(APIC)

    先看图再说:


    1.8259A 只适合单 CPU 的情况,为了充分挖掘 SMP 体系结构的并行性,能够把中断传递给系统中的每个 CPU 至关重要。基于此理由,Intel 引入了一种名为 I/O 高级可编程控 制器的新组件,来替代老式的 8259A 可编程中断控制器。该组件包含两大组成部分:一是“本地 APIC”,主要负责传递中断信号到指定的处理器;举例来说,一台具有三个处理器的机器,则它必须相对的要有三个本地 APIC。另外一个重要的部分是 I/O APIC,主要是收集来自 I/O 装置的 Interrupt 信号且在当那些装置需要中断时发送信号到本地 APIC,系统中最多可拥有 8 个 I/O APIC。 

    2 .每个本地 APIC 都有 32 位的寄存器,一个内部时钟,一个本地定时设备以及为本地中断保留的两条额外的 IRQ 线 LINT0 和 LINT1。所有本地 APIC 都连接到 I/O APIC,形成一个多级 APIC 系统。

    那么我们如何知道我们机子上使用的是那种中断控制器呢?

    我们可以通过在终端出入命令:cat /proc/interrupts 来查看

    a.若看到列表中有IO-APIC,说明您的系统正在使用 APIC。

    若看到 XT-PIC,意味着您的系统正在使用 8259A 芯片 。

    16位实地址模式的中断机制和32位保护模式的中断机制的最本质差别就是在保护模式心爱引入了中断描述表

    在单处理器的系统中,第一列是中断号,第二列是CPU产生该中断的次数。最后一列是于这个中断相关的俄设备名字。这个名字是通过 参数devname提供给函数request_irq()(下篇文章会对它讲解)

    三.中断描述表

    1.为什么引入  

    在实地址模式中,CPU把内存中从0开始的1kb空间作为一个中断向量表。表中的每个表项占四个字节,由两个字节的段地址和两个字节的偏移量组成,这样构成的地址就是相应中断处理程序的入口地址。

    但是在保护模式下,由4个字节的表项构成的中断向量表已经不能满足要求了。在保护模式下,中断向量表中的表项由8个字节组成。此时他也有了新的名字---->中断描述表(Interrupt Descriptor Table,IDT),其中的每个表项叫做一个门描述符(great descriptor)

    先来看图在说明:

    1>DPL:段描述符的特权级

    2>偏移量:入口函数地址的偏移量

    3>P:表示段是否在内存中的标志

    4>段选择符:入口函数所处代码段的选择符

    5>D:标志位,1表示32位,0标示16位

    6>xxx:3位门类型码

    门类型符主要分为

    a.中断门(interrupt gate):其类型码为110,中断门包含了一个中断或异常处理程序所在段的选择符和段内偏移量。

    当控制权通过中断门进入中断处理程序时,处理器清IF标志即关中断这样就避免了中断嵌套的发生。

    中断门中的DPL(请求特权级)为0,因此用户态中的进程不能访问中断门。所用的中断处理程序都由中断门激活,并全部限制在内核态。

    b..陷阱门(tap gate)其类型码为111。它与中断门类似,唯一的区别是控制权通过陷阱门进入处理程序时保持IF标志位不变,即不关中断。

    c.系统门(system gate):Linux内核特别设置的,用来让用户态的进程访问Intel的陷阱门。

    系统门的DPL为3。系统调用就是通过系统门进入内核的。

    2.在保护模式下,中断描述符表在内存的位置不再局限于从地址0开始的位置,而是可以放在内存的任何位置 。

    1>为了实现这个功能--->CPU中设计了一个中断描述符表寄存器IDTR,用来存放中断描述符表在内存的起始位置。

    2>中断描述表寄存器是一个48位的寄存器。它的低16为保存中断描述符表的大小,高32位保存中断描述表的基址。

    3>看下图 :

    我们知道了中断描述表的功能和基本设置后,那么系统是是在何时给它初始化以及是如何给它初始化的呢?

    首先Linux内核在系统的初始化阶段对中断进行初始化,其中包括有:初始化可编程控制器8259A;将中断描述符表的起始地址装入IDTR中,并初始化表中的每一项。

    3.中断的初始化

    1>用户进程可以通过INT指令发出一个中断请求,其中断请求向量在0~255之间。

    那么如何防止用户使用INT指令模拟非法的中断和异常?

    此时DPL就起作用了->将DPL置为0就可以了。

    2>但是,有时候必须让用户进程能够使用内核所提供的功能(比如系统调用)也就是从用户态进入内核态,此时就可以通过把中断门或陷阱门的DPL置为3来实现。

    3>当计算机在实模式时,中断描述符表被初始化,并由BIOS使用。

    but,在进入了Linux内核时,中断描述符表就被移到内存的另一个区域,并为进入保护模式进行预初始化:

    用汇编指令LIDT对中断描述符表寄存器IDTR进行初始化,即把IDTR置为0,然后把中断描述符表IDT的起始地址装入IDTR。

    4>中断描述表的初始化

    a.第一次初始化:用setup_idt()函数填充中断描述符表中的256个表项,填充时使用一个空的中断处理程序。因为现在还是在初始化阶段,还没有任何中断处理程序,因此,用这个空的 中断处理程序 来填充每个表项。

    b.第二此初始化:内核在启用分页功能后对IDT进行第二此初始化。

    此时,使用实际的陷阱和中断处理程序替换这个空的处理程序。一旦这个过程完成后,对于每个异常,IDT都包含一个专门的陷阱门或系统门,而对每个外部中断,IDT都包含专门的中断门。

     

    上面提到了对IDT的初始化,那么我们就递归深入下来看看系统是如何对IDT表项进行设置的

    4.IDT表项的设置

    IDT表项的设置是通过_set_gate()函数来实现的。

    1>插入一个中断门

    调用 set_intr_gate(n,addr)函数来实现

    此函数的功能是在IDT的第n个表项插入一个中断门。门中的段选择符设置成内核代码的段选择符,偏移量设置为中断处理程序的地址addr,DPL字段设置为0.

    分析下的形参:

    n:表示在第几个表项中插入一个中断门。

    addr:表示偏移量,此处偏移量设置为中断处理程序的地址addr.

    现在我们迭代深入,看下它的内部是如何实现的 

    1. 330static inline void set_intr_gate(unsigned int n, void *addr)  
    2. 331{  
    3. 332        BUG_ON((unsigned)n > 0xFF);  
    4. 333        _set_gate(n, GATE_INTERRUPT, addr, 0, 0, __KERNEL_CS);  
    5. 334}  

    我们可以看到它里面有封装了两个函数:我门继续迭代深入。

    a.我们先来看看第一个函数的原型和功能:

     

    [c-sharp] view plaincopy
    1. 19#if (_MIPS_ISA > _MIPS_ISA_MIPS1)  
    2.  20  
    3.  21static inline void  __BUG_ON(unsigned long condition)  
    4.  22{  
    5.  23        if (__builtin_constant_p(condition)) {  
    6.  24                if (condition)  
    7.  25                        BUG();  
    8.  26                else  
    9.  27                        return;  
    10.  28        }  
    11.  29        __asm__ __volatile__("tne $0, %0, %1"  
    12.  30                             : : "r" (condition), "i" (BRK_BUG));  
    13.  31}  
    14.  32  
    15.  33#define BUG_ON(C) __BUG_ON((unsigned long)(C))  
    16.  34  

    (1)我们可以看到BUG_ON()函数是一函数宏,系统最终调用的是 __BUG_ON((unsigned long)(C))

    函数:

    __BUG_ON((unsigned long)(C))它的作用是判断n是否大于255,若大于255则出错。

    此处的n表示在第n个表项中插入一个中断门(因为表项总共有255个,所以当n大于255时出错)。

    (2) _set_gate(n, GATE_INTERRUPT, addr, 0, 0, __KERNEL_CS);

    我们来分析下它的形参 :

    第一个形参 n:表示在那个表项中插入一个中断门。

    第二个形参 表示门描述符的类型,此处是插入一个中断门,所以它的形参是 GATE_INTERRUPT。

    第三个形参表示偏移量,设置为中断处理程序的地址addr。

    第四个形参表示DPL,我们可以看到给它传递的是0,即避免中断嵌套的发生。

    第五个形参表示IST(Interrupt Stack Table)共 3 位,表达 IST1 - IST7 共 7 个 Stack pointer 

    第六个形参表示门中的段选择符。此处设置成内核代码的段选择符。

    我们还可以继续深入到 _set_gate(n, GATE_INTERRUPT, addr, 0, 0, __KERNEL_CS)函数中看它到底是如何实现功能的,但由于篇幅有限。占时不在继续深入。

    2.插入一个陷阱门

    调用 set_trap_gate(n,addr)函数来实现。

    此函数的功能是:在IDT的第n个表项中插入一个陷阱门。门中的段选择符设置成内核代码的段选择符,偏移量设置为异常处理程序的地址addr,DPL字段设置为0。

    分析下的形参:

    n:表示在第几个表项中插入一个中断门。

    addr:表示偏移量,此处偏移量设置异常处理程序的地址addr.

    现在我们迭代深入,看下它的内部是如何实现的

    [c-sharp] view plaincopy
    1. 371static inline void set_trap_gate(unsigned int n, void *addr)  
    2. 372{  
    3. 373        BUG_ON((unsigned)n > 0xFF);  
    4. 374        _set_gate(n, GATE_TRAP, addr, 0, 0, __KERNEL_CS);  
    5. 375}  
     

    我们可以看到它内部同样封装了两个函数BUG_ON()和_set_gate()函数,它们的功能和实现方法都在上面具体分析过,再次不在分析。

    3.插入一个系统门

    调用 set_system_gate(n,addr)函数来实现。

    此函数的功能是在IDT的第n个表项插入一个系统门。门中的段选择符设置成内核代码的段选择符,偏移量设置为异常理程序的地址addr,DPL字段设置为3.(所以,系统调用在用户态下可以通过INT 0X80顺利通过系统门。从而进入内核态)

    分析形参:

    n:表示在第几个表项中插入一个中断门。

    addr:表示偏移量,此处偏移量设置为异常处理程序的地址addr.

    现在我们迭代深入,看下它的内部是如何实现的

    [c-sharp] view plaincopy
    1. 365static inline void set_system_trap_gate(unsigned int n, void *addr)  
    2. 366{  
    3. 367        BUG_ON((unsigned)n > 0xFF);  
    4. 368        _set_gate(n, GATE_TRAP, addr, 0x3, 0, __KERNEL_CS);  
    5. 369}  
    6. 370  

    我们可以看到它的内部实现还是和上面类似。唯一不同的是在_set_gate()函数中的两个参数不同。

    一个参数是DPL被设置为03,还有一个是门类型的类型是GATE_TRAP



    转自 http://blog.csdn.net/tigerjb/article/details/6067258

    展开全文
  • 深入理解中断(一)

    千次阅读 2019-05-06 20:52:21
    深入理解中断(一) 什么是中断中断是能够打断CPU指令序列的事件,它是在CPU内外,由硬件产生的电信号。CPU接收到中断后,就会向OS反映这个信号,从而由OS就会对新到来的数据进行处理。不同的事件,其对应的中断...

    转载自 http://sec-lbx.tk/2017/02/15/中断相关/#TSS 感谢原文作者

    深入理解中断(一)

    什么是中断?

    中断是能够打断CPU指令序列的事件,它是在CPU内外,由硬件产生的电信号。CPU接收到中断后,就会向OS反映这个信号,从而由OS就会对新到来的数据进行处理。不同的事件,其对应的中断不同,而OS则是通过中断号(也即IRQ线)来找到对应的处理方法。不同体系中,中断可能是固定好的,也可能是动态分配的。
    中断产生后,首先会告诉中断控制器。中断控制器负责收集所有中断源的中断,它能够控制中断源的优先级、中断的类型,指定中断发给哪一个CPU处理。
    中断控制器通知CPU后,对于一个中断,会有一个CPU来响应这个中断请求。CPU会暂停正在执行的程序,转而去执行相应的处理程序,也即OS当中的中断处理程序。这里,中断处理程序是和特定的中断相关联的。

    中断描述符表

    那么CPU是如何找到中断服务程序的呢?为了让CPU由中断号去查找到对应的中断程序入口,就需要在内存中建立一张查询表,也即中断描述符(IDT)。在CPU当中,有专门的寄存器IDTR来保存IDT在内存中的位置。这里需要注意的是,常说的中断向量表,是在实模式下的,中断向量是直接指出处理过程的入口,而中断描述符表除了入口地址还有别的信息。
    IDTR有48位,前32位保存了IDT在内存中的线性地址,后16位则是保存IDT的大小。而IDT自身,则是一个最大为256项的表(对应了8位的中断码),表中的每个向量,是一个入口。这里IDT表项的异常类型可以分为三种,其表项的格式也不同:
    任务门:利用新的任务方式去处理,需要切换TSS。它包含有一个进程的TSS段选择符,其偏移量部分没有用,linux没有采用它来进行任务切换。
    中断门:适宜处理中断,在进入中断处理时,处理器会清IF标志,避免嵌套中断发生。中断门中的DPL(Descriptor privilege Level)为0,因此用户态不能访问中断门,中断处理程序都是用中断门来激活的,并且限制在内核态。
    陷阱门:适宜处理异常,和中断门类似,但它不会屏蔽中断。
    以下是32bit中的IDT表项。
    在这里插入图片描述

    值得注意的是,CPU还提供一种门,调用门,它是linux内核特别设置的,通常通过CALL和JMP指令来使用,能够转移特权级。

    实模式和保护模式

    在了解CPU是如何通过中断向量表调用具体的服务程序之前,首先需要了解CPU的工作方式。
    对于IA-32架构,它支持实模式、保护模式和系统管理模式。
    实模式以拓展对方式实现了8086CPU的程序运行环境,处理器在刚刚上电和重启后时,处于实模式,其寻址空间最大为1M(2^20)。实模式的主要意义,在于提供更好的兼容性,开发者能够直接使用BIOS中断,从而在boot阶段不必关注硬件的具体实现。实模式主要还是为进入保护模式进行准备。
    8086处理器有16-bit寄存器和16-bit的外部数据总线,但能够访问20-bit的地址,因为它引入了“分段机制”,一个16bit的段寄存器包含了一个64KB的段的基址。而段寄存器+16bit的指针,就能够提供20bits的地址空间。其计算方式为:16位基地址左移4位+16位偏移量=20位。
    保护模式是处理器的根本模式。保护模式可以直接为实模式程序提供保护的,多任务的环境,这种特性被称为虚拟8086模式,它实际上是保护模式的一种属性。保护模式能够为任何任务提供这种属性。在保护模式中,地址依然通过“段+偏移量”的形式来实现,但此时段寄存器中保存的不再是一个段的基址,而是一个索引。通过这个索引可以找到一个表项,里面存放了段基址等许多属性,这个表项也就是段描述符,而这个表也就是GDT表。
    保护模式的最大寻址是2^32次方,也即4G,并且可以通过PAE模式访问超过4G的部分。它有4个安全级别,内存操作时,有安全检查。其分页功能带来了虚拟地址和物理地址的区别。
    系统管理模式为操作系统或者执行程序提供透明的机制去实现平台相关的特性,例如电源管理、系统安全。
    对于Intel 64架构,它增加了两种子模式。
    兼容模式允许绝大部分16bit-32bit应用无需编译就能在64bit下运行,它类似于保护模式,有4G的地址空间限制。
    64bit模式在64bit线性地址空间上运行应用程序,通用寄存器被增加到64bits。它取消了分段机制,其默认地址长度为64bits。

    x64寻址

    在保护模式下(32bit),物理地址的翻译分为两步:逻辑地址翻译(段)和线性地址翻译(页)。逻辑地址利用16bit segment selector和32bit offset来表示。处理器首先要将逻辑地址翻译为线性地址(32bit)。这个翻译过程如下:

    通过segment selector,在对应的GDT或LDT中去找到段描述符;
    检查段描述符,访问是否合法,段是否能够访问,偏移量是否在范围之内;
    将段基地址和偏移量相加来获取线性地址的值。
    在IA-32e模式下(64bit),逻辑地址的翻译步骤和上述过程类似,唯一不同的是,其段基地址和偏移量,都是64bit,而不是32bit的。线性地址同理也是32bit的。

    段寻址,也即将内存分成不同的段,利用段寄存器能够找到其对应的段描述符,从而获得相关的段基址、大小、权限等信息。
    在这里插入图片描述
    段寻址
    段选择子Segment selector的示意图如下:
    在这里插入图片描述

    段选择子会被存在段寄存器当中,其中最低两位为RPL(cs寄存器不同,最低位位CPL)。而第三位Table Indicator则是表示该从GDT还是LDT寻找对应的段描述符,后面的bits就是对应的index了。
    为了减少地址翻译的开销,处理器提供了6个段寄存器,CS,SS,DS,ES,FS,GS。通常来说一个程序至少有CS、DS、SS三个selector。假设程序要使用段来访问地址,那么必须将segment selector载入段寄存器当中。对此,Intel是提供了特殊的指令的,直接载入的指令包括MOV,POP,LDS,LES等。而隐含的载入则包括CALL,JMP,RET,SYSENTER等等。它们会改变CS寄存器(有时也会改变其它段寄存器)的内容。
    而在IA-32e模式下(64bit mode),ES,DS,SS段寄存器都不会使用了,因此它们的域会被忽视掉,而且某些load指令也被视为违法的,例如LDS。与ES,DS,SS段有关的地址计算,会被视为segment base为0。为了保证兼容性,在64bit mode当中,段load指令会正常执行,从GDT、LDT中读取时,也会读取寄存器的隐藏部分,并且值都会正常的载入。但是data、stack的segment selector和描述符都会被忽略掉。
    而FS和GS段在64bit mode能够手动使用,它们的计算方式为(FS/GS).base+index+displacement。用这种方式去进行内存访问时,是不会进行检查的。载入的时候不会载入Visible Part,也即Segment Selector,也就是把段机制给忽略了。

    IDT,LDT和GDT

    中断向量表提供了一个入口,但这个入口还需要进一步的计算。这个入口的计算,是通过段寻址来实现的。而段的信息,则是保存在LDT和GDT当中。
    段描述符的结构如下图:
    在这里插入图片描述

    段描述符最重要的部分是DPL位,它会在权限检查的时候使用。在进程需要装载一个新的段选择子时,会判断当前的CPL和RPL是否都比相应的DPL权限高,如果是则允许加载新的段选择子,否则产生GP。
    在操作系统中,全局描述符只有一张,也即一个CPU对应一个GDT。GDT可以存放在内存中的任何地址,但CPU必须知道GDT的入口,因此有一个寄存器GDTR用来存放GDT的入口地址,它存放了GDT在内存中的基址和表长。
    在这里插入图片描述

    GDT&LDT

    但是在64位系统当中,段机制就被取代了,而页表项也能够达到数据访问的保护目的。但是对于不同特权级之间的控制流转移,还是和原来的机制一样。在64-bit模式中,GDT依然存在,但不会改变,而其寄存器被拓展到了80bit。
    而GDT中会包含一个LDT段的段描述符,LDT是通过它的段描述符来访问的。
    在IA-32e模式下,段描述符表可以包含2^13个8-byte描述符。这里,描述符分为两种,段描述符会占据一个entry(8bit),而系统描述符会占据两个entry(16bit)。而GDTR和LDTR被拓展为能够保存64bit的基地址。其中,IDT描述符、LDT、TSS描述符和调用门描述符都被拓展称为了16bytes。

    64bit IDT描述符的格式如下
    在这里插入图片描述
    64bit LDT描述符的格式如下
    在这里插入图片描述
    64 bit LDT

    中断的处理过程

    在intel 手册上看到的大图,很详细的解释了IA-32模式和IA-32e模式下的系统架构,它也就包含了中断处理和线性地址的翻译过程。

    在这里插入图片描述
    在这里插入图片描述

    在中断产生之后,处理器会将中断向量号作为索引,在IDT表中找到对应的处理程序。IDT表将每个中断/异常向量和一个门描述符关联起来。在保护模式下,它是一个8-byte的描述符(与GDT,LDT类似),IDT最大有256项。IDT能够保存在内存中的任何位置,处理器用IDTR寄存器来保存它的值。
    在中断/陷阱门描述符中,segment selector指向了GDT或当前LDT中的代码段描述符,而offser域指向了exception/interrupt的处理过程。
    在这里插入图片描述

    在执行call这一步的时候,倘若handler过程会在一个更低的权限执行,那么就会涉及到stack switch。当stack switch发生时,segment selector和新的栈指针都需要通过TSS来获取,在这个栈上,处理器会把之前的segment selector和栈指针压入栈中。处理器还将保存当前的状态寄存器在新的栈上。
    如果handler过程会在相同的权限执行,处理器会把状态寄存器的值保存在当前的栈上。
    在这里插入图片描述
    IA-32e
    从中断处理程序返回时,handler必须使用IRET指令。它与RET类似,但它会将保存的标志位恢复到EFLAGS寄存器中。如果stack switch在调用过程中发生了那么IRET会切换到中断前的stack上。在中断过程中,权限级的保护与CALL调用过程类似,会对CPL进行检查。

    64-bit模式下的中断处理

    在64bit模式下,中断和异常的处理与非64bit模式下几本一致,但也存在一些不同的地方。包括有:

    IDT所指向的代码是64bit代码
    中断栈push的大小是64bit
    栈指针(SS:RSP)在中断时,无条件的被push(保护模式下是由CPL来决定的)
    当CPL有变化时,新的SS会被设置为NULL
    IRET的过程不同
    stack-switch的机制不同
    中断stack的对齐不同
    其中,64bit的IDT门描述符在前面已经介绍了。IST(interrupt Stack Table)用于stack-switch。通过中断门来调用目标代码段时,它必须为一个64bit的代码段(CS.L=1,CS.D=0)。如果不是也会触发#GP。在IA-32e模式下,只有64bit的中断和陷阱门能够被调用,遗留的32bit中断/陷阱都被重新定义为64bit的。

    在遗留模式中,IDT entry的大小是16/32bit,它决定了interrupt-stack-frame push时的大小。并且SS:ESP只在CPL发生改变时被压入stack中。在64bit模式下,interrupt-stack-frame push的大小被固定为8bytes(因为只有64bit模式的门能够被调用),而且SS:RSP是无条件压入栈中的。遗留模式下,Stack pointer能够在任何地址进行push,但是IA-32e模式之下,RSP必须是16-byte边界对齐的,而stack frame在中断处理程序被调用时也会对齐。而在中断服务结束时,IRET也会无条件的POP出SS:RSP,即使CPL=0。

    IA-32e模式下,stack-switching机制被替代了,它被称为interrupt stack table(IST)。
    遗留模式下,在64bit中,中断如果造成了权限级的改变,那么stack就会switch,但是这时不会载入新的SS描述符,而只会从TSS中载入一个inner-level的RSP。新的SS selector被强制设置为NULL,这样就能够处理内嵌的far transfers。而旧的SS和RSP会被保存在新的栈上。也就是说stack-switch机制除了SS selector不会从TSS加载之外,其余都一样。
    而新的IST模式,则是无条件的进行stack switch。它是基于IDT表项中的一块区域实现的,它的设计目的,是为特殊的中断(NMI、double-fault、machine-check)等提供方法。在IA-32e模式下,一部分中断向量能够使用IST,另一部分能够使用遗留的方法。
    IST在TSS中,提供7个IST指针,在中断门的描述符当中,由一个3bit的IST索引位,它们用来找到TSS中IST的偏移量。通过这个机制,处理器将IST所指向的值加载到RSP当中。而当中断发生时,新的SS selector被设置为NULL,并且SS selector的RPL区域被设置为新的CPL。旧的SS、RSP、RFLAGS、CS和RIP被push入新的栈中。如果IST的索引为0,那么就会使用修改后的、旧的stack-switch机制。

    保护机制

    Intel 64/IA-32架构提供了段/页级别的保护机制,它们利用权限级,来限制对于的段/页的访问,例如重要的OS代码和数据能够被放在更高权限级的段中,操作系统会保护它们不被应用程序访问。当保护机制启用时,每次内存访问都会被检查,这些检查包括:

    • Limit
    • Tyep
    • Privilege level
    • Restriction of Procedure entry-points
    • Restriction of instruction set
      通过CR0寄存器当中的PE flag能够开启保护模式,打开段保护机制;而页保护机制则是在分页机制启用时,自动开启的。虽然64bit中,不再使用分段机制了,但代码段依然存在。对于地址计算来说,其段地址被视为0,CS描述符当中的内容被忽略,但其余部分保持一致。代码段描述符、selector依然存在,它们在处理器的操作模式、执行权限级上依然发挥作用。其工作方式如下:

    CS描述符中会使用一个保留位,Bit 53被定义为64 bit flag位(L),并且被用来在64bit/兼容模式之间切换。当CS.L = 0时,CPU处于兼容模式,CS.D则决定了数据和地址的位数为16/32bit。如果CS.L为1,那么只有CS.D = 1是合法的,并且地址和数据的位数是64bit。在IA-32e模式下,CS描述符当中的DPL位被用来做执行权限的检查(与32bit模式一样)。
    在这里插入图片描述

    Limit Checking

    在段描述符当中,有一个limit field,它防止程序访问某个段之外的的内存位置,其有效值由G flag来决定,对于数据段来说,其limit还由E flag和B flag决定。在64bit模式下,处理器不会对代码段活着数据段进行limit check,但是会对描述符表的limit进行检查。

    Type checking

    段描述符包含两个type 信息,S flag和type field。处理器会使用这个信息,来检查对段和门的不正确使用。S flag表示descriptor的类型,它包括系统/代码/数据三种类型。在处理一个段选择子时,处理器会在:
    将segment selector载入段寄存器:寄存器只能包含对应的描述符类型
    指令访问段时:段只能被相应的指令访问
    指令包含segment selector时:指令只能对某些特定类型的段/门进行访问
    进行某些具体操作时:far call、far jump,对调用门、任务门的call/jump等,会判断描述符中的类型是否符合要求。

    Privilege levels

    处理器的段保护机制包含有4个privilege levels,从0到3,0最高,3最低。处理器利用这种机制,来防止一个低权限的进程,访问更高权限的部分。为了实现这个目的,处理器使用3种类型的权限级:
    CPL:当前执行任务的权限级。它保存在CS和SS段寄存器的bit 0-1中。通常,CPL和当前代码段的权限一致,当跳转到一个有不同权限的代码段时,CPL会发生变化。如果目标是一致代码段,则会延续当前的CPL。
    DPL:segment或者gate的权限级。它保存在段或者门的描述符当中,当当前的代码段执行,需要访问一个段或者gate的时候,这个段/门的DPL就会被拿来与CPL和RPL进行比较。在不同的环境下,DPL的意义也是不同的。
    RPL:与segment selector有关的,能够对权限进行覆盖的权限级。它保存在segment selector的bit 0-1中。处理器会通过CPL和RPL来判断对segment的访问是否合法。即使请求访问某个段的程序,拥有比段更高的权限,如果RPL不是有效的,访问还是会被拒绝。也就是说如果RPL把CPL高,那么RPL会覆盖CPL。RPL能够保证提权的代码,不能随意访问一个segment段,除非它自身有这个权限。直观的说,必须CPL和RPL都比DPL要高,只有这种情况下,才会允许这个段的访问。其主要目的,是允许高权限为低权限提供服务的时候,能够通过较低的权限来加载段。
    门调用符与权限检查:
    在这里插入图片描述
    gate

    TSS

    处理器执行工作的单位,被称为task。一个task分为两个部分,task的执行空间和task-state segment(TSS)。前者指的是code/stack/data segment,而后者则定义了组成前者的各个段。task是由TSS的segment selector来识别的。当一个任务被加载到处理器中执行时,segment selector、基址、limit、TSS的段描述符等都会被加载到task register(TR)当中去。分页启动时,页目录的基址还会载入到控制寄存器CR3当中去。
    一个任务的状态,由一系列的寄存器和TSS来定义。这里,处理器定义了5个数据结构,来处理任务相关的活动。

    • TSS
    • Task-gate描述符
    • TSS描述符
    • Task寄存器
    • EFLAGS寄存器中的NT flag
      为了恢复一个task,处理器所需要的信息,保存在一个系统段中,它被称为TSS。在64bit模式下,它的格式如下:
      在这里插入图片描述

    而TSS描述符,则和其他的段一样,是由一个段描述符来定义的,它的结构在上文中已经给出了(与LDT是一致的),它只能放在GDT当中,不能放在LDT或者IDT当中。

    Task寄存器保存了当前TSS的段选择子和整个段描述符。它包含可见和不可见两个部分(能否被软件修改)。段选择子位于可见部分,指向GDT当中的TSS描述符。不可见部分则是用来保存TSS的段描述符(能够提高执行效率)。
    在这里插入图片描述

    展开全文
  • ARM笔记(中断

    万次阅读 2017-12-04 21:04:06
    什么是中断? 在处理器中,所谓中断,是一个过程,即CPU在正在执行程序过程中,遇到外部/内部紧急事件需要处理,暂时中止当前程序执行转而去 为事件服务,待服务完毕,再返回到暂停处(断点)继续执行原来的程序。为...
    什么是中断?
    在处理器中,所谓中断,是一个过程,即CPU在正在执行程序过程中,遇到外部/内部紧急事件需要处理,暂时中止当前程序执行转而去
    为事件服务,待服务完毕,再返回到暂停处(断点)继续执行原来的程序。为事件服务的程序称之为中断服务程序或中断处理程序。严格来说上述过程是针对硬件中断而言的,用软件方法也可以引起中断。硬件原因引起的中断过程中是不可测的,随机的,软件中断是可以人为控制的
    断点:一个地址,程序在该处中断,转而取执行中断程序的地址。


    中断源:引起中断的信号源。

    异常优先级的概念
    同时出现两个中断源,就会出现先处理哪个中断的问题。出现这种问题以后,这里就产生一个中断优先级的概念。
    ARM处理器中有7种类型的异常,按照优先级从高到低的排列顺序如下:
    1.复位异常(reset)
    2.数据异常(data abort)
    3.快速中断异常(fiq)
    4.外部中断异常(irq)
    5.预取异常(prefetch abort)
    6.软件中断(swi)
    7.未定义指令异常(undef)

    中断:
    1. 硬中断 内部中断(不可),外部中断(可屏蔽),外部中断:外部中断一般是指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。外部中断是可以屏蔽的中断,也就是说,利用中断控制器可以屏蔽这些外部设备的中断请求。内部中断:内部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、运算溢出、单步中断等)所引起的中断。内部中断是不可屏蔽的中断。
    2. 软中断(不可),软件中断其实并不是真正的中断,它们只是可被调用执行的一般程序

    中断响应流程图

    通用中断控制器generic interrupt control

    中断号:每个中断源都被分配了一个独一无二的中断号(0-1019)
    中断掩码:在汇编语言中进行中断前,需要对相应的中断状态字进行授权允许或屏蔽相关中断的操作。
    GIC支持的三种中断类型
    1. 软件产生的中断SGI,软件生成的中断寄存器(ICDSGIR)。 每个SGI都可以定位多个处理器。 在里面分销商和有针对性的处理器中,SGI通过其中断的组合来唯一标识编号,ID0-ID15和发出处理器的处理器源ID(CPUID0-CPUID7)SGI。(SGI号 0-15)
    2. 私有的外设中断PPI,在特定模式下使用的中断Interrupt numbers ID16-ID31 are used for interrupts that are private to a CPU interface and are banked in theDistributor。(PPI号 0-15)
    3. 共享的外设中断SPI,外设产生的可以发送给一个或多个核心处理的中断源。Interrupt numbers ID32-ID1019 are used for SPIs.(SPI号 0-987)

    中断源

    GIC中断控制器框图

    The main blocks of the GIC are:
     AMBA slave interface  AMBA从属接口
     Distributor 分配器
     CPU interface CPU接口
     Clock and reset 时钟和重置
     Enable and match signals  启用和匹配信号

    GIC主要功能模块:分配器和CPU接口
    分配器接收中断,并向相应的CPU接口提供最高优先级的中断。 一个
    优先级较低的中断在成为最高优先级时转发到相应的CPU接口
    待处理中断。
    GIC支持160个中断,Total 160 interrupts including Software Generated Interrupts (SGIs[15:0], ID[15:0]), Private Peripheral Interrupts(PPIs[15:0], ID[31:16]) and Shared Peripheral Interrupts (SPIs[127:0], ID[159:32]) are supported. For SPI, you can
    service a maximal 32 * 4 = 128 interrupt requests(SPI号)
    分配器框架图

    The Distributor provides a programming interface for:
     Enabling the forwarding of interrupts to the CPU interfaces globally. 
     Enabling or disabling each interrupt.
     Setting the priority level of each interrupt.
     Setting the target processor list of each interrupt.
     Setting each peripheral interrupt to be level-sensitive or edge-triggered.
     Setting each interrupt as either secure or Non-secure if the GIC implements the Security Extensions.
     Sending an SGI to one or more target processors.
    启用全局中断向CPU接口的转发。
    启用或禁用每个中断。
    设置每个中断的优先级。
    设置每个中断的目标处理器列表。
    将每个外设中断设置为电平敏感或边沿触发。
    如果GIC执行安全扩展,则将每个中断设置为安全或不安全。
    将SGI发送到一个或多个目标处理器。
    查看任意中断的状态
    提供软件方式设置或清除任意中断的挂起状态
    中断使用中断号进行标识,每个接口可以处理多达1020个中断
    Interrupts from sources are identified using ID numbers. Each CPU interface can see up to 1020 interrupts. The
    distributor supports up to 1244 interrupts because of banking of SPIs and PPIs.

    CPU接口

    Programming interface for:
     Enabling the signaling of interrupt requests by the CPU interface.
     Acknowledging an interrupt.
     Indicating completion of the processing of an interrupt.
     Setting an interrupt priority mask for the processor.
     Defining the preemption policy for the processor.
     Determining the highest priority pending interrupt for the processor.
    编程接口
    通过CPU接口发出中断请求的信号。
    确认中断。
    指示完成中断的处理。
    为处理器设置一个中断优先级掩码。
    为处理器定义抢占策略。
    确定处理器的最高待处理中断。

    中断状态转换图

    中断状态
    1. inactive(无效) 中断没有发生
    2. pending(待处理) 中断发生,等待核心处理,待处理的中断都作为通过CPU接口发送到核心处理的候选者。
    3. active(正在处理) 中断给了核心,目前正在进行中断处理
    4. active and pending (处理和待处理)一个中断源正在被核心处理而GIC又接收到来自同一中断源的中断触发信号。

    转换A1或A2,添加挂起状态
    对于SGI:
    在写入指定处理器为目标的ICDSGIR时发生转换。
    只有在指定SGI的安全配置(适用于CPU接口)对应于ICDSGIR.SATT位值。如果GIC执行安全扩展和在Secure中写入ICDSGIR。
    对于SPI或PPI,如果出现以下情况,则发生转换:
    外设发出中断信号或
    软件写入ICDISPR。
    转换B1或B2,删除挂起状态
    过渡不适用于SGI:
    待处理的SGI应该通过活动状态进行转换或重置以删除其挂起状态。
    处于活动状态的待处理SGI应该通过挂起状态进行转换,或者进行重置以删除挂起状态。
    对于SPI或PPI,如果出现以下情况,则发生转换:
    电平敏感的中断仅在输入信号有效时才处于等待状态,断言或由于触发了一个边沿触发的中断信号,或者写入一个中断,中断处于待处理状态
    ICDISPR。该软件然后写入相应的ICDICPR。
    过渡C.
    如果中断被启用并且具有足够的优先级来向处理器发送信号,则软件转换发生从ICCIAR读取。
    过渡D.
    对于SGI,如果关联的SGI被启用并且分发器将其转发到CPU接口,则发生转换同时处理器读取ICCIAR以确认先前的SGI实例。是否
    这种转变的发生,取决于ICCIAR的阅读时间与重新规定SGI的时间。
    对于SPI或PPI:
    转换发生在
    中断使能。
    从ICCIAR读取软件。该读取将激活状态添加到中断。
    - 中断信号保持有效,用于电平敏感中断。这是因为外设没有中断中断直到处理器服务中断。
    对于边沿触发中断,是否发生此转换取决于读取的时序ICCIAR相对于检测到重新中断的中断。否则会导致ICCIAR的读取
    过渡C,可能之后是过渡A2。转换E1或E2,删除活动状态
    当软件写入ICCEOIR时发生转换。

    外设和中断控制器处理流程

    按键状态
    1. 低电平(按下去状态)
    2. 高电平(弹起来状态)
    3. 下降沿(高电平向低电平跳变的过程)
    4. 上升沿(低电平向高电平跳变的过程)

    寄存器描述
    1. ICCICR_CPUn 0x0000 CPU interface control register 0x0000_0000 CPU接口控制寄存器(CPU接口内中断送到相应CPU)
    2. ICCPMR_CPUn 0x0004 Interrupt priority mask register 0x0000_0000 中断优先级过滤寄存器(255所有中断都被相应,0不相应任何中断)
    3. ICDISERm_CPUn 0x0100 Interrupt set-enable register (SGI,PPI) 0x0000_FFFF 中断使能寄存器(使能相应中断到分配器)
    4. ICDIPTRm_CPUn 0x0800 Processor targets register (SGI[3:0]) 0x0101_0101 中断目标CPU配置寄存器(选择CPU接口)
    5. ICDDCR 0x0000 Distributor control register 0x0000_0000 分配器控制器(打开分配器)
    6. ICCIAR_CPUn 0x000C Interrupt acknowledge register 0x0000_03FF 中断响应寄存器

    7. ICCEOIR_CPUn 0x0010 End of interrupt register Undefined 中断处理结束寄存器(清除CPU内部相应的中断号)
    8. ICDICPRm_CPUn 0x0280 Interrupt pending-clear register (SGI,PPI) 0x0000_0000 中断状态清除寄存器(清除相应的中断标志位)
    按键的寄存器配置
    1. EXT_INT41_PEND 0x0F44 External interrupt EXT_INT41 pending register 0x0000_0000(配置按键的中断pending)
    2. EXT_INT41_CON 0x0E04 External interrupt EXT_INT41 configuration register 0x0000_0000(配置按键的触发方式)
    3. EXT_INT41_MASK 0x0F04 External interrupt EXT_INT41 mask register 0x0000_00FF(按键使能中断)

    按键的触发方式

    具体寄存器
    ICDSER根据中断号选择对应的专门管理所有中断使能寄存器使能中断

    ICDPTRm_CPUn,中断号为57-32=25,选ICDIPTR14

    根据GIC Interrupt Table查出EINT[9]中断号为57,SP1号为57-32=25,根据下图,八位控制CPU的接口,这里我们的CPU只有四核,每个寄存器控制四个中断的CPU接口选择,SPI号为25,在SPI[27:24],这里我们的CPU接口为0,八位的值为0x00000001(选择哪个接口哪个接口置1),所以这里配置为ICDIPTR.ICDIPTR14= 0X1 << 8



    具体事例代码

    /*
     * main.c
     *
     *  Created on: 2017-12-4
     *      Author: Administrator
     */
    #include"exynos_4412.h"
    voiddo_irq()
    {
         unsignedint irq_num;//获取中断号
         irq_num = CPU0.ICCIAR& 0X3FF;
         switch(irq_num)
         {
         case57:
              printf("i'm key2 interrupter! interrupter id is %d\n",irq_num);
              GPF3.DAT= 0x1 << 4;
              EXT_INT41_PEND = 0X1 << 1;//中断重启
              ICDICPR.ICDICPR1= 0X1 << 25;//清理相应的中断标志位
              break;
         case58:
              printf("i'm key3 interrupter! interrupter id is %d\n",irq_num);
              GPF3.DAT= 0x1 << 5;
              EXT_INT41_PEND = 0x1 << 2;   // 清除相应中断源
              ICDICPR.ICDICPR1= 1 << 26;
              break;
         default:
              printf("interrupter not exist\n");
              break;
         }
         CPU0.ICCEOIR= (CPU0.ICCEOIR& ~(0x3ff)) | irq_num;//清理相应的中断号
    }
    voidmydelay_ms(inttime) {
         inti, j;
         while(time--) {
              for(i = 0; i < 5; i++)
                  for(j = 0; j < 514; j++)
                       ;
         }
    }
    voidperipheral_init()
    {
         GPF3.CON= GPF3.CON& (~(0xf << 16)) | 0x1 << 16;//灯
         GPF3.CON= GPF3.CON& (~(0xf << 20)) | 0x1 << 20;
         GPX1.CON= GPX1.CON& (~(0xf << 4)) | 0xF << 4;//引脚位外部中断
         GPX1.CON= GPX1.CON& (~(0xf << 8)) | 0xF << 8;//引脚位外部中断
         EXT_INT41_CON = EXT_INT41_CON & (~(0X3 << 4)) | (0X2 << 4);//下降沿触发
         EXT_INT41_CON = EXT_INT41_CON & (~(0X3 << 8)) | (0X2 << 8);//下降沿触发
         EXT_INT41_MASK = EXT_INT41_MASK & (~(0X1 << 1)); //使能中断
         EXT_INT41_MASK = EXT_INT41_MASK & (~(0X1 << 2)); //使能中断
    }
    voidgic_init()
    {
         ICDDCR =1;//使能分配器
         CPU0.ICCICR= 0X1;//使能CPU接口
         CPU0.ICCPMR= 0XFF;//优先级最低,所有中断都会响应
         ICDISER.ICDISER1= (0X1 << 25) | (0x1 << 26);
         ICDIPTR.ICDIPTR14= (0X1 << 8) | (0x1 << 16);   //中断送到相应CPU
    }
    intmain()
    {
         peripheral_init();
         gic_init();
         while(1)
         {
              printf("working!\n");
              GPF3.DAT= ~(0x3 << 4);
              mydelay_ms(800);
         }
    }
    展开全文
  • 中断

    2018-07-24 20:35:34
    中断是指在在CPU运行过程中出现了某些意外,CPU立即中断正在处理的事情,去处理中断服务程序,处理完后,再返回处理原来的事情,就叫中断。  中断也可以理解为插队。他处理的是紧急的事情或者实时性比较高的事情。...

           中断是指在在CPU运行过程中出现了某些意外,CPU立即中断正在处理的事情,去处理中断服务程序,处理完后,再返回处理原来的事情,就叫中断。

            中断也可以理解为插队。他处理的是紧急的事情或者实时性比较高的事情。

           引起CPU中断的根源是中断源。

           中断的具有不确定性,它不知道什么时候什么地点会发生什么中断。

           中断的特点:同步工作

                                异常处理

                               实时处理

           中断的好处:1)提高了CPU的效率

                                2)可以实现实时处理

                               3)可以及时处理故障

           中断函数语法:void  函数名()  interrupt n

                                      用定时器0              interrupt 1

                                      用定时器1              interrupt  3

                                      用定时器2              interrupt  5(52单片机里面的)

     

    中断源                               中断标志             中断服务入口                            优先级高低

    外部中断0(/INT0)          IE0                           0003H                                       高

    定时/计数器0(T0)          TF0                          000BH                                        |

    外部中断1(/INT1)          IE1                           0013H                                         |

    定时/计数器1(T1)          TF1                          001BH                                        |

    串行口                                R1或T1                   0023H                                       低

    展开全文
  • 中断全过程

    千次阅读 2019-04-18 14:24:17
    中断全过程指的是从中断源发出中断请求开始,CPU响应这个请求,现行程序被中断,转至中断服务程序,直到中断服务程序执行完毕,CPU再返回原来的程序继续执行的整个过程。 为中断服务程序会用到寄存器和存储器的...
  • ZYNQ的中断(一)

    千次阅读 2018-11-04 19:46:46
    1.ARM中断体系 中断的意思就不多说了。主要说明几个知识点: (1)ARM体系中,在存储地址的低位,固化了一个32字节的硬件中断向量表。 (2)异常中断发生时,程序计数器PC所指的位置不同,异常中断就不同。中断...
  • 浅谈中断与异常

    千次阅读 2019-05-08 13:42:02
    首先讲下硬中断和软中断的区别 硬中断:硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件...
  • 51单片机中断系统

    万次阅读 多人点赞 2020-04-10 17:43:40
    中断定义  CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续...
  • 操作系统中的中断

    千次阅读 2019-04-10 10:12:32
    中断是指CPU对系统发生的某个事件做出的一种反应,CPU暂停正在执行的程序,保存现场后自动去执行相应的处理程序,处理完该事件后再返回中断处继续执行原来的程序。。中断一般三类,一种是由CPU外部引起的,称为外...
  • 详解操作系统中断

    千次阅读 2017-10-17 17:06:08
    中断这个特性相比大家都不会陌生,稍微懂点操作系统知识的人都可以说到一二。但是要真正把中断描述清楚,以及LInux中和windows中的实现方式,这可能还是有点难度的。今天笔者就想彻头彻尾的把中断给详细分析下。 ...
  • 什么是中断

    千次阅读 2018-10-25 19:24:53
    说到这个问题,我先在网上搜索了一些回答,然后再进行我的回答。 网上的回答如下: 请问,看了上面的回答,你明白了吗?如果明白了,你可以不用继续看下面的文字了,如果还不明白请继续看下面的文字 ...
  • 轮询 和 中断 的比较

    2020-07-17 22:31:29
    我们首先区别一下中断和轮询 中断和轮询是 嵌入式 的两个基本的编程的思想和 概念 轮询: while(1){ if(按键按下){ 执行程序; } } /* 周期连续 的检测外部事件的发生 消耗大量cpu...
  • 中断和软中断

    万次阅读 多人点赞 2014-03-27 16:42:36
    本文主要内容:硬中断 / 软中断的原理和实现 内核版本:2.6.37 Author:zhangskd @ csdn blog   概述   从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给...
  • 可屏蔽中断和非屏蔽中断区别

    万次阅读 2016-12-02 18:24:02
    按照是否可以 被屏蔽,可将中断分为两大类:不可屏蔽中断(又叫非屏蔽中断)和可屏蔽中断。  不可屏蔽中断源一旦提出请求,cpu必须无条件响应,而对于可屏蔽中断源的请求,cpu可以响应,也可以不响应。cup一般设置...
  • 中断的概念和中断处理过程

    万次阅读 2011-11-02 10:38:20
    中断的概念和中断处理过程 (1)中断: 在运行一个程序的过程中,断续地以“插入”方式执行一些完成特定处理功能的程序段,这种处理方式称为中断。 (2)中断的作用: ◎并行操作 ◎硬件故障报警与处理 ◎...
  • 中断向量 每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向量。所有中断中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程序入口的跳转指令构成一张表...
  • 51单片机中断详解(上)

    万次阅读 多人点赞 2015-11-22 15:35:33
    一.中断的概念 中断发生 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理 ...中断过程示意图三.MCS51中断系统的结构MCS51的中断系统有5个中断源(8052有 6个) ,2个优先级,可实现二级中断嵌套 中
  • 中断和硬中断的区别

    万次阅读 2011-08-23 23:59:09
    ①硬中断是由外部事件引起的因此具有随机性和突发性;软中断是执行中断指令产生的,无面...②硬中断中断响应周期,CPU需要发中断回合信号(NMI不需要),软中断中断响应周期,CPU不需发中断回合信号。 ③硬中断
  • 硬件中断和软件中断的区别

    万次阅读 多人点赞 2016-10-07 19:40:05
    中断中断指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就...
  • LPC-2124中断概述

    万次阅读 2014-03-21 14:15:10
    向量中断控制器的作用就是允许哪些中断源可以产生中断、可以产生哪类中断、产生中断后执行哪段服务程序。 中断源列表 允许中断源产生中断  芯片内部许多部件都可以作为中断源,但并不是每个中断源都需要在...
1 2 3 4 5 ... 20
收藏数 755,986
精华内容 302,394
关键字:

中断