• 全面解析Linux 内核 3.10.x


    转自:https://blog.csdn.net/ongoingcre/article/details/50269869

        From: 全面解析Linux 内核 3.10.x - 中断子系统

    前程往事,历历在目 - 佚名
    一、基本概念

    IPI 全称为Inter-Processor Interrupt,即处理中间的中断,需要可编程中断控制器PIC or APIC的支持!
    操作流程大概如下:
    IPI
    需要向IPI 控制寄存器中写入需要recv interrupt vector,写入的IDB代表了类似IRT Entry的ID,最多可以广播16个硬件处理线程!DTE可以设置硬件处理线程的掩码,支持NMI!
    二、实例描述
    1、应用场景描述

    以XLP3XX为示例,来对IPI进行简单了解。

    XLP3xx支持160个IRT ENTRY,
    即160个64 Bit的IRT寄存器!
    Pcie 访问地址问bus 0,device 0,function 4 + 0x40000(EFCG_BASE)
    支持8个128 Bit 位的ITE 寄存器!

        1
        2
        3
        4

    2、和普通中断的的区别是什么?

    说到普通中断
    首先我们来回顾一下中断类型!
    从原理上可以划分为:硬中断和软中断
    从类型上可以划分为:可屏蔽中断,不可屏蔽中断,共享中断
    这里我们所说的中断一般指的是一个中断线对应一个硬件处理线程,除了共享中断!
    所谓共享中断从硬件角度上其实就是一根中断线被复用了,所以可以对应多个硬件处理线程!
    然后IRT触发后的信号被多个硬件所使用!也就是说这一点必须需要硬件支持!
    上述简单的说了一下基本中断类型!
    如需要了解更多关于中断的信息!请查看
    而我们的核间中断则是一个硬件线程去中断另外一个硬件线程!
    3、优点是什么?

    避免CPU线程的浪费,很大限度上将有效的控制CPU硬件线程,发挥SMP多核处理的优势!
    4、简单示例

    request_irq(TEST_IRQ,handler_test,0,”ipi_test”,NULL);
    int ipi_trigger(unsigned int dst)
    {
    unsigned int reg_value;
            unsigned int volatile *pic_base_addr = 0x18040100;
    pic_base_addr -= 0x40; //对齐
    reg_value = (1 << dst) | (dst / 16 <<  16) | (TEST_IRQ << 20);
    *(pic_base_addr + 0x4e) |= reg_value;
    }

        1
        2
        3
        4
        5
        6
        7
        8
        9

        By: Keven - 点滴积累
    ————————————————
    版权声明:本文为CSDN博主「Keven2116」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ongoingcre/article/details/50269869

  • 相关阅读:
    八、JVM视角浅理解并发和锁
    七、JVM类加载机制
    六、JVM命令和工具
    五、jvm垃圾回收3(几种垃圾收集器)
    四、JVM垃圾回收2(垃圾收集算法)
    jvm引用类型
    三、JVM垃圾回收1(如何寻找垃圾?)
    【原创】Android 对话框的使用
    【原创】CMD常用命令:解决实际问题
    【原创】开机出现grub rescue,修复办法
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/13361337.html
Copyright © 2020-2023  润新知