精华内容
下载资源
问答
  • 中断和中断处理流程

    千次阅读 2020-12-20 04:41:20
    1. 中断概念中断是指由于接收到来自外围硬件(相对于中央处理器和内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器...

    1. 中断概念

    中断是指由于接收到来自外围硬件(相对于中央处理器和内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。中断在计算机多任务处理,尤其是实时系统中尤为有用。这样的系统,包括运行于其上的操作系统,也被称为“中断驱动的”(interrupt-driven)。

    中断是一种使CPU中止正在执行的程序而转去处理特殊事件的操作,这些引起中断的事件称为中断源,它们可能是来自外设的输入输出请求,也可能是计算机的一些异常事故或其它内部原因。

    中断:在运行一个程序的过程中,断续地以“插入”方式执行一些完成特定处理功能的程序段,这种处理方式称为中断。

    2. 中断的作用

    并行操作

    硬件故障报警与处理

    支持多道程序并发运行,提高计算机系统的运行效率

    支持实时处理功能

    3. 术语

    按中断源进行分类:发出中断请求的设备称为中断源。按中断源的不同,中断可分为

    内中断:即程序运行错误引起的中断

    外中断:即由外部设备、接口卡引起的中断

    软件中断:由写在程序中的语句引起的中断程序的执行,称为软件中断

    允许/禁止(开/关)中断: CPU通过指令限制某些设备发出中断请求,称为屏蔽中断。从CPU要不要接收中断即能不能限制某些中断发生的角度 ,中断可分为

    可屏蔽中断 :可被CPU通过指令限制某些设备发出中断请求的中断, 那是不是意味着进中断时disable整个中断,其实disable的都是可屏蔽中断?

    不可屏蔽中断:不允许屏蔽的中断如电源掉电

    中断允许触发器:在CPU内部设置一个中断允许触发器,只有该触发器置“1”,才允许中断;置“0”,不允许中断。

    指令系统中,开中断指令,使中断触发器置“1”

    关中断指令,使中断触发器置“0”

    中断优先级:为了管理众多的中断请求,需要按每个(类)中断处理的急迫程度,对中断进行分级管理,称其为中断优先级。在有多个中断请求时,总是响应与处理优先级高的设备的中断请求。

    中断嵌套:当CPU正在处理优先级较低的一个中断,又来了优先级更高的一个中断请求,则CPU先停止低优先级的中断处理过程,去响应优先级更高的中断请求,在优先级更高的中断处理完成之后,再继续处理低优先级的中断,这种情况称为中断嵌套。

    Intel的官方文档里将中断和异常理解为两种中断当前程序执行的不同机制。这是中断和异常的共同点。不同点在于:

    中断(interrupt)是异步的事件,典型的比如由I/O设备触发;异常(exception)是同步的事件,典型的比如处理器执行某条指令时发现出错了等等。

    中断又可以分为可屏蔽中断和非可屏蔽中断,异常又分为故障、陷阱和异常中止3种,它们的具体区别很多书籍和官方文档都解释的比较清楚这里不再赘述。

    关于它们的区别有两点是需要注意的:

    平常所说的屏蔽中断是不包括异常的,即异常不会因为CPU的IF位被清(关中断,指令:cli)而受影响,比如缺页异常,即使关了中断也会触发CPU的处理,回答了我上面红色部分疑问。

    通常说的int 80h这种系统调用使用的中断方式实际上硬件上是理解为异常处理的,因此也不会被屏蔽掉,这也很好理解,int 80h这种中断方式是程序里主动触发的,对于CPU来说属于同步事件,因此也就属于异常的范畴。

    4. 中断(异常)处理过程

    需要明确的一点是CPU对于中断和异常的具体处理机制本质上是完全一致的,即:

    当CPU收到中断或者异常的信号时,它会暂停执行当前的程序或任务,通过一定的机制跳转到负责处理这个信号的相关处理程序中,在完成对这个信号的处理后再跳回到刚才被打断的程序或任务中。这里只描述保护模式下的处理过程,搞清楚了保护模式下的处理过程(更复杂),实模式下的处理机制也就容易理解了。

    具体的处理过程如下:

    1)  中断响应的事前准备:

    系统要想能够应对各种不同的中断信号,总的来看就是需要知道每种信号应该由哪个中断服务程序负责以及这些中断服务程序具体是如何工作的。系统只有事前对这两件事都知道得很清楚,才能正确地响应各种中断信号和异常。

    系统将所有的中断信号统一进行了编号(一共256个:0~255),这个号称为中断向量,具体哪个中断向量表示哪种中断有的是规定好的,也有的是在给定范围内自行设定的。  中断向量和中断服务程序的对应关系主要是由IDT(中断向量表)负责。操作系统在IDT中设置好各种中断向量对应的中断描述符(一共有三类中断门描述符:任务门、中断门和陷阱门),留待CPU查询使用。而IDT本身的位置是由idtr保存的,当然这个地址也是由OS填充的。

    中断服务程序具体负责处理中断(异常)的代码是由软件,也就是操作系统实现的,这部分代码属于操作系统内核代码。也就是说从CPU检测中断信号到加载中断服务程序以及从中断服务程序中恢复执行被暂停的程序,这个流程基本上是硬件确定下来的,而具体的中断向量和服务程序的对应关系设置和中断服务程序的内容是由操作系统确定的。

    2) CPU检查是否有中断/异常信号

    CPU在执行完当前程序的每一条指令后,都会去确认在执行刚才的指令过程中中断控制器(如:8259A)是否发送中断请求过来,如果有那么CPU就会在相应的时钟脉冲到来时从总线上读取中断请求对应的中断向量[2]。

    对于异常和系统调用那样的软中断,因为中断向量是直接给出的,所以和通过IRQ(中断请求)线发送的硬件中断请求不同,不会再专门去取其对应的中断向量。

    3) 根据中断向量到IDT表中取得处理这个向量的中断程序的段选择符

    CPU根据得到的中断向量到IDT表里找到该向量对应的中断描述符,中断描述符里保存着中断服务程序的段选择符。

    4) 根据取得的段选择符到GDT中找相应的段描述符

    CPU使用IDT查到的中断服务程序的段选择符从GDT中取得相应的段描述符,段描述符里保存了中断服务程序的段基址和属性信息,此时CPU就得到了中断服务程序的起始地址。这里,CPU会根据当前cs寄存器里的CPL和GDT的段描述符的DPL,以确保中断服务程序是高于当前程序的,如果这次中断是编程异常(如:int 80h系统调用),那么还要检查CPL和IDT表中中断描述符的DPL,以保证当前程序有权限使用中断服务程序,这可以避免用户应用程序访问特殊的陷阱门和中断门[3]。

    5) CPU根据特权级的判断设定即将运行的中断服务程序要使用的栈的地址

    CPU会根据CPL和中断服务程序段描述符的DPL信息确认是否发生了特权级的转换,比如当前程序正运行在用户态,而中断程序是运行在内核态的,则意味着发生了特权级的转换,这时CPU会从当前程序的TSS信息(该信息在内存中的首地址存在TR寄存器中)里取得该程序的内核栈地址,即包括ss和esp的值,并立即将系统当前使用的栈切换成新的栈。这个栈就是即将运行的中断服务程序要使用的栈。紧接着就将当前程序使用的ss,esp压到新栈中保存起来。也就说比如当前在某个函数中,使用的栈,在中断发生时,需要切换新的栈。

    6) 保护当前程序的现场

    CPU开始利用栈保护被暂停执行的程序的现场:依次压入当前程序使用的eflags,cs,eip,errorCode(如果是有错误码的异常)信息。

    官方文档[1]给出的栈变化的示意图如下:

    7) 跳转到中断服务程序的第一条指令开始执行

    CPU利用中断服务程序的段描述符将其第一条指令的地址加载到cs和eip寄存器中,开始执行中断服务程序。这意味着先前的程序被暂停执行,中断服务程序正式开始工作。

    8) 中断服务程序处理完毕,恢复执行先前中断的程序

    在每个中断服务程序的最后,必须有中断完成返回先前程序的指令,这就是iret(或iretd)。程序执行这条返回指令时,会从栈里弹出先前保存的被暂停程序的现场信息,即eflags,cs,eip重新开始执行。

    展开全文
  • 1、异常与中断的处理流程(中断属于异常): 2、小节: 中断函数是怎么被调用的???? 当有中断信号被cpu检测到,cpu...2)、处理异常–》执行不同的中断处理函数(在这个函数里面,做的事情是:分辨中断源;调用对

    1、异常与中断的处理流程(中断属于异常):

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

    2、小节:

    中断函数是怎么被调用的????
    当有中断信号被cpu检测到,cpu会通过中断向量表,知道他要跳转到0x18地址。Cpu就会强制跳转这个地址(这个是由硬件决定的,硬件保证了cpu必须跳到0x18地址),我们在这个地址,放一条跳转指令ldr pc,_irq;根据这个指令,cpu会再次跳转,跳转到irq函数。函数做的事情是(这部分是由软件决定的):
    1)、保存现场。
    2)、处理异常–》执行不同的中断处理函数(在这个函数里面,做的事情是:分辨中断源;调用对应的中断先处理函数)
    3)、恢复现场
    参考韦东山老师教程!!!

    展开全文
  • 中断概念及其作用1、中断概念中断-----指计算机在执行* * 第7章 中断系统与8237A DMA控制器 7.1 中断系统概述 7.1.1 中断概念及其作用 1、中断概念 中断-----指计算机在执行正常程序的过程中出现内部或外部...

    中断的概念及其作用1、中断的概念中断-----指计算机在执行

    * * 第7章 中断系统与8237A DMA控制器 7.1 中断系统概述 7.1.1 中断的概念及其作用 1、中断的概念 中断-----指计算机在执行正常程序的过程中出现内部或外部某     些事件的请求时,CPU暂时停止当前程序的正常执行,    转去执行请求事件的处理操作,CPU在事件处理结束    后再回到被暂时中断了的程序继续往下执行。 当前正运行的程序 中断处理程序 图7-1 中断示意表 ┇ 指令A 指令B 指令C ┇ 中断请求 指令1 指令2 ┇ ┇ IRET CPU响 应中断 中断返回 2、中断系统的作用 (1)能实现并行处理 (2)能实现实时处理 (3)能实现故障处理 7.1.2 中断处理系统 一个完整的中断处理系统必须实现以下功能: 中断源识别 中断优先级判断 中断嵌套管理 CPU的中断响应 中断服务 中断返回 1、中断源识别 中断源----引起程序中断的事件。 图7-2 向量中断技术中断源识别示意图 外设中断请求 D7 ┇ CPU D1 D0 INTR ┇ 外设提供 设备标志码 2、中断优先级判断 中断优先级判断的具体方法可分为:软件查询、硬件排队和专用 中断控制器。 (1)软件查询方式 图7-3 软件查询接口电路 接口电路简单 优先权次序为查询的先后顺序 时间长 适合中断源较少 实时性要求不高的场合 N 保护现场,读中断位状态 出错处理 恢复现场开中断 A中断服务子程序 中断入口 是A请求? Y N 是B请求? B中断服务子程序 是H请求? H中断服务子程序 返回 Y Y N 图7-4 软件查询程序流程 ┇ (2)硬件排队方式 图7-5 中断优先权编码电路 硬件排队方式 的中断优先级判断电路常用: 中断优先权编码电路和链式优先权排队电路 中断优先权编码电路: 硬件编码器、比较器、优先权寄存器 8个中断,任一个有中断或门进入到1和2 8个中断进入编码组产生一个优先权编码A2A1A0:111至000 优先权寄存器中优先权失效信号为0, B2B1B0 进入比较器,A和 B比较,若A高于B,比较器输出高电平1门开,将A的中断请求 信号送入,否则,输出低电平,封锁1门,屏蔽该中断请求; 优先权寄存器中优先权失效信号为1,优先权失效,任何一个中 断均可通过2门进入。 (3)专用中断控制器 3、中断嵌套管理:IR0 至IR7优先级降低 STI (EOI) IRET IR2和IR4中断请求 STI 。 。 。 (EOI) IRET IR1中断请求 IR2 中断清除 IR4 中断请求 开中断 IR1 中断清除 主程序 IR2处理程序 IR1处理程序 STI 。 。 。 (EOI) IRET STI 。 。 。 (EOI) IRET IR3中断请求 开中断 IR3 中断清除 IR4处理程序 IR3处理程序 IR4 中断清除 图7-6 中断嵌套管理 4、中断处理过程 CPU取下一条指令 中断源提出中断请求 判优逻辑进行优先排队 CPU执行完当前指令 中断请求信号有效?  CPU允许中断? CPU关闭中断 保护断点地址 找出中断源,形成中断服务 程序入口地址,并转向中断服务 保护现场 执行中断服务程序 恢复现场 CPU开放中断 返回主程序断点处 中断请求 中断判优 中断响应 中断处理 中断返回 Y Y N N 图7-7 中断处理基本过程 7.2 8086CPU中断系统 7.2.1 8086CPU的中断源 256种中断可分为两大类:外部中断和内部中断。 INT 3 指令 INT n 指令 INT O 指令 除法 出错 单步 中断 中 断 处 理 逻 辑 非屏蔽 中断请求 8259A  8086 CPU INTR 可屏蔽中断请求 NMI 图7-8 8086系统的中断源 1、中断源的类型 (1)外部中断(硬件中断) 分为非屏蔽中断和可屏蔽中断两种。 1)非屏蔽中断:NMI,有求必应,掉电、紧急停机处理,多个查询 2)可屏蔽中断:INTR,IF=1响应,与8259配合多个中断源 (2)内部中断(软件中断) 1)单步中断-----------中断类型号是1 TF=1产生,调试程序,正常执行0 2)除法出错中断-------中断类型号是0 DIV,IDIV执行时,商超出了规定的范围产生

    展开全文
  • 1. 对异常概念的理解异常就是可以打断CPU...2.Linux内核中断处理流程基于Linux-2.6.29.41、Linux内核中异常向量表的拷贝内核启动时将异常向量表从物理地址0x00000000拷贝到0xffff0000的虚拟地址中去;其中异常向量...

    1. 对异常概念的理解

    异常就是可以打断CPU正常运行的事件,比如,外部中断、未定义的指令、软中断等。当这些异常发生时,就打断CPU的正常运行,跳到相应的异常处理程序去处理这些异常要求的一些操作。

    2. Linux内核中断处理流程

    基于Linux-2.6.29.4

    1、Linux内核中异常向量表的拷贝

    内核启动时将异常向量表从物理地址0x00000000拷贝到0xffff0000的虚拟地址中去;

    其中异常向量在arch/arm/kernel/entry-armv.S中定义

    中断向量表

    .globl __vectors_start

    __vectors_start:

    swi SYS_ERROR0

    b vector_und+ stubs_offset

    ldr pc,.LCvswi + stubs_offset

    b vector_pabt+ stubs_offset

    b vector_dabt+ stubs_offset

    b vector_addrexcptn+ stubs_offset

    b vector_irq+ stubs_offset

    b vector_fiq+ stubs_offset

    .globl __vectors_end

    __vectors_end:

    注:内核启动时调用start_kernel()函数,在start_kernel()中又调用了大量的函数。

    asmlinkagevoid __init

    start_kernel(void)

    {

    .....................................

    setup_arch(&command_line);

    mm_init_owner(&init_mm,&init_task);

    setup_command_line(command_line);

    .....................

    sched_init();

    .....................

    init_IRQ();

    rest_init();

    }

    函数setup_arch()在arch/arm/kernel/setup.c中

    void__init

    setup_arch(char **cmdline_p)

    {

    .........................

    memcpy(boot_command_line,from,

    COMMAND_LINE_SIZE);

    boot_command_line[COMMAND_LINE_SIZE-1]=

    '\0';

    parse_cmdline(cmdline_p,from);

    paging_init(mdesc);

    request_standard_resources(&meminfo,mdesc);

    .............................

    ...............................

    early_trap_init();

    }

    void__init

    early_trap_init(void)

    {

    ........................................

    memcpy((void*)vectors,

    __vectors_start, __vectors_end -

    __vectors_start);

    memcpy((void*)vectors +

    0x200, __stubs_start, __stubs_end -

    __stubs_start);

    memcpy((void*)vectors +

    0x1000 - kuser_sz, __kuser_helper_start,

    kuser_sz);

    ...............................

    }

    2、Linux内核中中断处理流程

    首先,内核启动时完成中断初始化框架的流程

    在start_kernel()中调用init_IRQ(),该函数在arch/arm/kernel/irq.c中被定义,被用来初始化中断的处理框架,设置各种中断的默认处理函数。当发生中断时,中断总入口函数asm_do_IRQ()就可以调用这些函数作进一步处理。

    void__init

    init_IRQ(void)

    {

    intirq;

    for(irq =

    0; irq < NR_IRQS; irq++)

    irq_desc[irq].status|=

    IRQ_NOREQUEST | IRQ_NOPROBE;

    #ifdefCONFIG_SMP

    bad_irq_desc.affinity=

    CPU_MASK_ALL;

    bad_irq_desc.cpu=

    smp_processor_id();

    #endif

    init_arch_irq();

    }

    其中init_arch_irq()被定义为

    void(*init_arch_irq)(void)

    __initdata = NULL;

    它的作用如下,

    void__init

    setup_arch(char **cmdline_p)

    {

    structmachine_desc *mdesc;

    。。。。。。。。。。

    setup_processor();

    mdesc=

    setup_machine(machine_arch_type);

    machine_name=

    mdesc->name;

    memcpy(boot_command_line,from,

    COMMAND_LINE_SIZE);

    boot_command_line[COMMAND_LINE_SIZE-1]=

    '\0';

    parse_cmdline(cmdline_p,from);

    paging_init(mdesc);

    request_standard_resources(&meminfo,mdesc);

    cpu_init();

    init_arch_irq=

    mdesc->init_irq;

    system_timer=

    mdesc->timer;

    init_machine=

    mdesc->init_machine;

    early_trap_init();

    }

    structmachine_desc{

    unsignedint

    nr;

    unsignedint

    phys_io;

    unsignedint

    io_pg_offst;

    constchar

    *name;

    unsignedlong

    boot_params;

    unsignedint

    video_start;

    unsignedint

    video_end;

    unsignedint

    reserve_lp0 :1;

    unsignedint

    reserve_lp1 :1;

    unsignedint

    reserve_lp2 :1;

    unsignedint

    soft_reboot :1;

    void

    (*fixup)(structmachine_desc *,

    struct tag

    *, char **,

    struct

    meminfo *);

    void

    (*map_io)(void);

    void (*init_irq)(void);

    structsys_timer

    *timer;

    void

    (*init_machine)(void);

    };

    static

    structmachine_desc * __init setup_machine(unsignedint

    nr)

    {

    structmachine_desc

    *list;

    list=

    lookup_machine_type(nr);

    if(!list)

    {

    printk("Machineconfiguration

    botched (nr %d), unable "

    "to

    continue.\n", nr);

    while(1);

    }

    printk("Machine:%s\n",

    list->name);

    returnlist;

    }

    ENTRY(lookup_machine_type)

    stmfd

    sp!,{r4 - r6, lr}

    mov

    r1,r0

    bl

    __lookup_machine_type

    mov

    r0,r5

    ldmfd

    sp!,{r4 - r6, pc}

    ENDPROC(lookup_machine_type)

    __lookup_machine_type:

    adr

    r3,3b

    ldmia

    r3,{r4, r5, r6}

    sub r3,r3,

    r4 @ get offset between virt&phys

    add r5,r5,

    r3 @ convert virt addresses to

    add r6,r6,

    r3 @ physical address space

    1: ldr

    r3,[r5, #MACHINFO_TYPE] @ get machine type

    teq r3,r1 @

    matches loader number?

    beq 2f

    @found

    add r5,r5,

    #SIZEOF_MACHINE_DESC @ next machine_desc

    cmp

    r5,r6

    blo

    1b

    mov r5,#0 @

    unknown machine

    2: mov

    pc,lr

    ENDPROC(__lookup_machine_type)

    接下来是内核完成启动后响应中断的流程

    当CPU被中断时,强制跳转到异常中断向量表中的

    b vector_fiq+ stubs_offset

    如vector_irq这些是宏,定义在vector_stub

    irq,IRQ_MODE, 4

    vector_stubirq,IRQ_MODE,

    4

    这两句对应

    .macrovector_stub,irq,IRQ_MODE,correction=4

    .align 5

    vector_irq:

    .if4

    sub lr,lr, #4计算返回地址

    .endif

    @

    @Save r0, lr_ (parent PC) and spsr_

    @(parent CPSR)

    @保存被中断时CPU的现场

    stmia sp,{r0, lr} @ save r0, lr

    mrs lr,spsr

    str lr,[sp, #8] @ save spsr

    @

    @Prepare for SVC32 mode. IRQs remain disabled.

    @进入系统模式

    mrs r0,cpsr

    eor r0,r0, #(\mode ^ SVC_MODE)

    msr spsr_cxsf,r0

    @

    @the branch table must immediately follow this code

    @

    and lr,lr, #0x0f

    mov r0,sp

    ldr lr,[pc, lr, lsl #2]

    movs pc,lr @ branch to handler in SVC mode继续执行跳转

    ENDPROC(vector_irq)

    .endm

    执行完上述语句后,跳转到

    vector_stub

    irq,IRQ_MODE, 4

    .long

    __irq_usr @ 0 (USR_26 / USR_32)

    如果是用户态发生中断时,跳转到__irq_usr地址去执行

    .long

    __irq_invalid @ 1 (FIQ_26 / FIQ_32)

    .long

    __irq_invalid @ 2 (IRQ_26 / IRQ_32)

    .long

    __irq_svc @ 3 (SVC_26 / SVC_32)

    .long

    __irq_invalid @ 4

    .long

    __irq_invalid @ 5

    .long

    __irq_invalid @ 6

    .long

    __irq_invalid @ 7

    .long

    __irq_invalid @ 8

    .long

    __irq_invalid @ 9

    .long

    __irq_invalid @ a

    .long

    __irq_invalid @ b

    .long

    __irq_invalid @ c

    .long

    __irq_invalid @ d

    .long

    __irq_invalid @ e

    .long

    __irq_invalid @ f

    当用户态发生中断是跳到__irq_usr

    __irq_usr:

    usr_entry

    kuser_cmpxchg_check

    #ifdefCONFIG_TRACE_IRQFLAGS

    bl

    trace_hardirqs_off

    #endif

    get_thread_infotsk

    #ifdefCONFIG_PREEMPT

    ldr

    r8,[tsk, #TI_PREEMPT] @ get preempt count

    add r7,r8,

    #1 @ increment it

    str

    r7,[tsk, #TI_PREEMPT]

    #endif

    .macro

    irq_handler

    get_irqnr_preambler5,

    lr

    1:

    get_irqnr_and_baser0, r6, r5, lr

    movne

    r1,sp

    @

    @routine

    called with r0 = irq number, r1 = struct pt_regs

    *

    @

    adrne

    lr,1b

    bne asm_do_IRQ

    ***位于irq.c

    asmlinkagevoid

    __exception asm_do_IRQ(unsigned int irq, struct pt_regs

    *regs)

    {

    structpt_regs *old_regs

    = set_irq_regs(regs);

    irq_enter();

    if(irq

    >= NR_IRQS)

    handle_bad_irq(irq,&bad_irq_desc);

    else

    generic_handle_irq(irq);

    irq_finish(irq);

    irq_exit();

    set_irq_regs(old_regs);

    }

    irq_desc定义在include/linux/irq.h中

    structirq_desc{

    unsignedint

    irq;

    #ifdefCONFIG_SPARSE_IRQ

    structtimer_rand_state

    *timer_rand_state;

    unsignedint

    *kstat_irqs;

    #ifdef

    CONFIG_INTR_REMAP

    structirq_2_iommu

    *irq_2_iommu;

    #endif

    #endif

    irq_flow_handler_t

    handle_irq;

    structirq_chip

    *chip;

    structmsi_desc

    *msi_desc;

    void

    *handler_data;

    void

    *chip_data;

    structirqaction

    *action;

    unsignedint

    status;

    unsignedint

    depth;

    unsignedint

    wake_depth;

    unsignedint

    irq_count;

    unsignedlong

    last_unhandled;

    unsignedint

    irqs_unhandled;

    spinlock_t

    lock;

    #ifdefCONFIG_SMP

    cpumask_t

    affinity;

    unsignedint

    cpu;

    #endif

    #ifdefCONFIG_GENERIC_PENDING_IRQ

    cpumask_t

    pending_mask;

    #endif

    #ifdefCONFIG_PROC_FS

    structproc_dir_entry

    *dir;

    #endif

    constchar

    *name;

    }

    定义在include/linux/irq.h

    staticinline void

    generic_handle_irq(unsigned int irq)

    {

    generic_handle_irq_desc(irq,irq_to_desc(irq));

    }

    staticinline void

    generic_handle_irq_desc(unsigned int irq, struct

    irq_desc*desc)

    {

    #ifdefCONFIG_GENERIC_HARDIRQS_NO__DO_IRQ

    desc->handle_irq(irq,desc);

    #else

    if(likely(desc->handle_irq))

    desc->handle_irq(irq,desc);

    else

    __do_IRQ(irq);

    #endif

    }

    最终处理的函数为handle_irq,为用户自定义。。。

    展开全文
  • 文章目录0.前言1.简介2.设备树中断信息结点2.1 GIC中断...中断的上下半部5.1 中断处理函数5.2 中断上半部与下半部5.1.1 上半部5.1.2 下半部5.2.1 软中断softirq_vec数组5.2.3 tasklettasklet_structtasklet_inittasklet
  • 缺页中断处理过程.ppt

    2020-12-20 04:41:16
    缺页中断处理过程3.5.3 存储保护与共享 1. 分页式存储中的存储保护与共享 . 在页式环境下,存储保护以页面为单位。在页表的每个表项里设置一个所谓的“保护位”,由该位的不同取值定义对应页是可读、可写或只可读等...
  • 分别介绍了中断、异常、软中断、硬中断概念并比较
  • 中断概念和作用

    2021-08-02 15:02:17
    中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理 对于不同的中断信号,会进行不同的处理 发生了中断,就意味着需要操作系统介入,开展管理工作。由于操作系统的管理工作(比如进程切换、...
  • 中断处理的详细过程

    2021-07-31 16:36:27
    经过中断判优,中断处理进入中断响应阶段,中断响应时,CPU向中断源发出中断响应信号,同时: 保护硬件现场 关中断 保存断点 获得中断服务程序的入口地址 4. 中断服务阶段 保护现场 开中断:即允许中断服务...
  • 计算机中断概念.ppt

    2021-07-27 07:27:04
    第2章PC机接口芯片 本章概要接口电路通常有专用芯片可选 本章介绍4款常用的PC机接口芯片 8259 中断管理接口芯片8253 定时器 计数器接口芯片8237 DMA控制芯片8255 并行I O接口芯片上述接口芯片最早用于PC XT中 后来...
  • 第1章 异常与中断概念处理流程1.1中断的引入1.1.1妈妈怎么知道孩子醒了1.1.2 嵌入系统中也有类似的情况1.2 中断处理流程1.3 异常向量表1.4 参考资料 本文来自“Linux系列教程之快速入门”里的“嵌入式Linux...
  • 中断概念 中断是一种通知机制,中断使得硬件得以发出通知给处理器。中断的本质是一种特殊的电信号,由硬件设备发向处理器,处理器接收到中断后,会马上向操作系统反映此信号的到来,然后由操作系统负责处理这些新来...
  • 在计算机中,中断是处理器与异步事件进行信息交换(通信)的唯一手段。所谓异步事件,就是与当前正在做的事情在逻辑上无关的事件。例如,正当老师上课的过程中突然发生了地震,那么地震这个事件就是一个异步事件。因为...
  • 中断怎么发生,中断处理大概流程 1. 中断概念:  中断是指由于接收到来自外围硬件(相对于中央处理器和内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。发出这样的信号称为进行中断请求...
  • 158 Linux中断基础概念

    2021-11-04 22:26:30
    文章目录一、回顾二、设备树中GIC中断控制器节点三、外设中断控制器节点三、其他设备使用中断节点1、中断类型四、常用函数1、request_irq()函数(1)irq_handler_tirqreturn_t(2)flags2、free_irq()函数3、enable_...
  • 首先解释一些容易混淆的概念:中断上下文:正在执行ISR或者下半部。没有进程背景(只是暂停CPU去内存中其他地方执行一段快速代码),所以不能被切换(比如...以前中断处理程序都是使用中断进程的内核栈(只有一个),但是...
  • 而引入中断机制之后,如果发生了中断,CPU将从用户态转变为核心态,CPU的使用权也将交给操作系统内核,由内核程序去处理中断,中断处理完成之后,CPU的使用权返回给用户程序(不一定是之前执行的程序),所以说,中断...
  • 中断,STM32里最重要的一环,可以说,如果学不会中断,你后期写的操作系统就是个废物,因为有的异常你根本无法处理,既然中断这么重要,那我们就先学习一下关于中断,都要什么寄存器。 目录一、中断和异常二、NVIC和...
  • 嵌入式LINUX驱动开发(中断处理函数)2020年08月11日|萬仟网网络运营 |我要评论嵌入式LINUX驱动学习之7中断相关(一)中断处理函数一、函数、头文件及说明二、编译举例:一、函数、头文件及说明//头文件位置:include/...
  • 原标题:Linux中断机制:硬件处理,初始化和中断处理来源: CSDN | phenix_lord的专栏硬件处理最近解决一个关于Linux中断的问题,把相关机制整理了一遍,记录在此。不同的外部设备、不同的体系结构、不同的OS其中断...
  • 在Python的signal模块封装了中断处理的一些接口。需要指出的是,signal模块提供的接口处理的不是中断,而是Windows或Linux的消息。为方便,仍以中断称呼。 signal.signal(signalnum, handler)函数用于设置中断: ...
  • 中断处理机制

    2021-10-19 22:30:48
    (1)为什么内核需要中断? (2)硬件实现一个中断需要做什么?...在中断处理函数中,没有所谓的进程的概念。所以不存在直接向用户空间发送消息,也不存在进程的调度,以及进程阻塞。 内核中...
  • Linux系统对中断处理

    千次阅读 多人点赞 2021-08-23 15:02:50
    2.1.3 进程、线程的概念2.2 Linux系统对中断处理的演进2.2.1 Linux对中断的扩展:硬件中断、软件中断2.2.2 中断处理原则1:不能嵌套2.2.3 中断处理原则2:越快越好2.2.4 要处理的事情实在太多,拆分为:上半部、下半...
  • arm中断处理流程

    2020-12-21 03:07:02
    计数器(PC)值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。在接收到中断请求以后,ARM处理器内核会自动执行以上四步,程序计数器PC总是跳转到相应的固定地址。从异常中断处理程序中...
  • 文件:操作系统中断方式小结.rar大小:15KB下载:X86体系中,CPU在INTR引脚上接到一个中断请求信号,如果此时IF=1,CPU就会在当前指令执行完以后开始响应外部的中断请求,这时,CPU在INTA引脚连续发两个负脉冲,外设在...
  • 与STC15中断相关的概念中断结构图CPU处理中断中断相关的寄存器7. 外部IO口输入中断INT0的测试具体步骤: 1. 中断基础概念 2. 中断的执行过程 3. 中断作用及中断类型 4. 中断嵌套 5. 中断学习的材料 6. 与STC...
  • 在mainbord上,我们有一个中断控制器(IRC),它充当可引发中断的设备与CPU之间的多路复用器:|--------||-----------| | |-(0)------| IRC _____|______| CPU |-(...)----| ____/ | | |-(15)-----|/ | |--...
  • 中断的含义

    2021-07-27 07:27:02
    2、是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。二...
  • 4. ARM中断处理实现

    2021-11-15 17:21:52
    ARM中断处理实现1. 中断概念2. 中断流程图3. 中断控制器流程图4. 外部中断实现1. 汇编程序2. C语言程序3. 编译和运行 1. 中断概念 为什么要有中断?cpu和外设之间要进行通信,那么cpu怎么知道外设有数据来,有两种...
  • SA_INTERRUPT当置位了, 这表示一个"快速"中断处理. 快速处理在当前处理器上禁止中断来执行 (这个主题在"快速和慢速处理"一节涉及).SA_SHIRQ这个位表示中断可以在设备间共享. 共享的概念在"中断共享"一节中略述.SA_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 164,199
精华内容 65,679
关键字:

中断处理的概念