精华内容
下载资源
问答
  • DPDK 中断机制 eal_intr_handle_interrupts

    千次阅读 2015-08-04 21:38:45
    在rte_eal_intr_init()函数中初始化中断。具体如下: 1、首先初始化intr_sources链表。所有UIO设备的中断都挂在这个链表上,中断处理线程通过遍历这个链表,来执行设备的中断。 2、创建intr_pipe管道,用于...

    DPDK通过在线程中使用epoll模型,监听UIO设备的事件,来模拟操作系统的中断处理。

     

    一、中断初始化

    在rte_eal_intr_init()函数中初始化中断。具体如下:

    1、首先初始化intr_sources链表。所有UIO设备的中断都挂在这个链表上,中断处理线程通过遍历这个链表,来执行设备的中断。

    2、创建intr_pipe管道,用于epoll模型的消息通知。

    3、创建线程intr_thread,线程的执行体是eal_intr_thread_main()函数,创建epoll模型,遍历intr_sources链表,监听已注册的所有UIO设备的中断事件,并调用对应UIO设备的中断处理函数。

    复制代码
     1 int
     2 rte_eal_intr_init(void)
     3 {
     4     int ret = 0;
     5 
     6     /* init the global interrupt source head */
     7     TAILQ_INIT(&intr_sources);
     8 
     9     /**
    10      * create a pipe which will be waited by epoll and notified to
    11      * rebuild the wait list of epoll.
    12      */
    13     if (pipe(intr_pipe.pipefd) < 0)
    14         return -1;
    15 
    16     /* create the host thread to wait/handle the interrupt */
    17     ret = pthread_create(&intr_thread, NULL,
    18             eal_intr_thread_main, NULL);
    19     if (ret != 0)
    20         RTE_LOG(ERR, EAL,
    21             "Failed to create thread for interrupt handling\n");
    22 
    23     return -ret;
    24 }
    复制代码

    中断线程执行主体eal_intr_thread_main()函数具体如下:

    1、epoll_create()创建epoll模型。

    2、将intr_pipe管道加入到epoll中。

    3、遍历intr_sources链表,将所有UIO设备加入到epoll中。

    4、在eal_intr_handle_interrupts()函数中,在一个for(;;)死循环中,调用epoll_wait()阻塞模式监听事件。如果有事件发生,则调用eal_intr_process_interrupts()函数,最终会调用到相应UIO设备注册的中断处理函数。

    复制代码
     1 static __attribute__((noreturn)) void *
     2 eal_intr_thread_main(__rte_unused void *arg)
     3 {
     4     struct epoll_event ev;
     5 
     6     /* host thread, never break out */
     7     for (;;) {
     8         /* build up the epoll fd with all descriptors we are to
     9          * wait on then pass it to the handle_interrupts function
    10          */
    11         static struct epoll_event pipe_event = {
    12             .events = EPOLLIN | EPOLLPRI,
    13         };
    14         struct rte_intr_source *src;
    15         unsigned numfds = 0;
    16 
    17         /* create epoll fd */
    18         int pfd = epoll_create(1);
    19         if (pfd < 0)
    20             rte_panic("Cannot create epoll instance\n");
    21 
    22         pipe_event.data.fd = intr_pipe.readfd;
    23         /**
    24          * add pipe fd into wait list, this pipe is used to
    25          * rebuild the wait list.
    26          */
    27         if (epoll_ctl(pfd, EPOLL_CTL_ADD, intr_pipe.readfd,
    28                         &pipe_event) < 0) {
    29             rte_panic("Error adding fd to %d epoll_ctl, %s\n",
    30                     intr_pipe.readfd, strerror(errno));
    31         }
    32         numfds++;
    33 
    34         rte_spinlock_lock(&intr_lock);
    35 
    36         TAILQ_FOREACH(src, &intr_sources, next) {
    37             if (src->callbacks.tqh_first == NULL)
    38                 continue; /* skip those with no callbacks */
    39             ev.events = EPOLLIN | EPOLLPRI;
    40             ev.data.fd = src->intr_handle.fd;
    41 
    42             /**
    43              * add all the uio device file descriptor
    44              * into wait list.
    45              */
    46             if (epoll_ctl(pfd, EPOLL_CTL_ADD,
    47                     src->intr_handle.fd, &ev) < 0){
    48                 rte_panic("Error adding fd %d epoll_ctl, %s\n",
    49                     src->intr_handle.fd, strerror(errno));
    50             }
    51             else
    52                 numfds++;
    53         }
    54         rte_spinlock_unlock(&intr_lock);
    55         /* serve the interrupt */
    56         eal_intr_handle_interrupts(pfd, numfds);
    57 
    58         /**
    59          * when we return, we need to rebuild the
    60          * list of fds to monitor.
    61          */
    62         close(pfd);
    63     }
    64 }
    复制代码

     

     二、中断注册

    以e1000网卡为例说明。在网卡初始化的时候,会调用rte_eth_dev_init()--->eth_igb_dev_init()--->rte_intr_callback_register()注册中断处理函数。

    1 rte_intr_callback_register(&(pci_dev->intr_handle),
    2     eth_igb_interrupt_handler, (void *)eth_dev);

    rte_intr_callback_register()函数,主要工作如下:

    1、首先申请一个struct rte_intr_source变量。

    1 struct rte_intr_source {
    2     TAILQ_ENTRY(rte_intr_source) next;
    3     struct rte_intr_handle intr_handle; /**< interrupt handle */
    4     struct rte_intr_cb_list callbacks;  /**< user callbacks */
    5     uint32_t active;
    6 };

    2、将中断处理函数eth_igb_interrupt_handler,添加到rte_intr_source->callbacks链表中。

    3、再将该rte_intr_source挂到全局intr_sources链表中,方便中断处理线程遍历调用。

    展开全文
  • 8088系统的中断

    2020-06-25 23:41:29
    1.按照中断请求的来源可以分为 ... □ IF=1表示开中断,CPU响应INTR中断 □ IF=0表示关中断,CPU不响应INTR中断 § 非屏蔽中断----NMI中断(上升沿有效) □ 只要有NMI请求,CPU就一定会响应中

    1.按照中断请求的来源可以分为

    	○ 内部中断(完全在CPU内部实现)
    		§ 异常中断----异常事件引起的(掉电、除法、溢出等)
    		§ 软件中断----中断指令引起的(INT n---中断调用系统的DOS功能)
    	○ 外部中断
    		§ 可屏蔽中断----INTR引脚上输入的中断(高电平有效)。
    			□ IF=1表示开中断,CPU响应INTR中断
    			□ IF=0表示关中断,CPU不响应INTR中断
    		§ 非屏蔽中断----NMI中断(上升沿有效)
    			□ 只要有NMI请求,CPU就一定会响应中断
    

    2.中断处理的过程

    	○ 中断请求
    		§ 边沿触发:适用于CPU可以及时响应的中断
    			□ NMI采用的就是边沿触发中断
    		§ 电平触发:适用于CPU不能及时响应的中断,所以需要中断源保持一段时间
    			□ INTR采用的是电平中断
    			□ 电平中断的请求信号应该一直保持到CPU响应中断为止;CPU响应中断后要及时撤除,避免引起多次响应
    

    在这里插入图片描述

    			□ 外设的中断请求信号IRQ被锁存进中断请求寄存器中
    			□ 经过逻辑输入到INTR外部可屏蔽中断引脚
    			□ CPU响应中断之后会以此查询并行端口的中断状态,查询到哪个中断时就去响应哪个中断源的中断服务程序
    			□ 缺点:花费的时间较长,影响中断响应的实时性
    			□ 优点:线路简单、优先权安排灵活
    

    在这里插入图片描述

    				® 中断控制器安排各中断源的优先级级别
    				® 核心思想:根据中断向量码(中断类型码)来确定中断源,每一个中断类型码都对应有一个中断服务程序入口
    			□ 链式判优
    					○ 中断响应
    		§ CPU响应中断的条件
    			□ 1.正在执行的指令的最后一个时钟周期执行结束
    			□ 2.CPU处于开中断状态也即IF=1(对于NMI则无此要求)
    			□ 3.当前没有发生复位(RESET)、保持(HOLD),因为此时CPU没有工作不可能响应中断请求;
    			□ 4.内部中断和非屏蔽中断请求(NMI),因为他们的优先级高于INTR,CPU会优先响应NMI
    			□ 5.若当前正在执行开中断STI、中断返回指令IRET,则他们执行完后再执行一条指令,CPU才可以相响应中断请求;
    			    若对于前缀指令,LOCK、REP等,CPU会将他们和其后的一条指令看作是一个整体,然后待这条指令执行完之后再响应中断请求
    		§ 中断响应时,CPU会向中断源发出中断响应信号,同时会做如下工作
    			□ 保护硬件现场FLAGS
    			□ 保护断点(先压入CS,再压入IP)
    			□ 获得中断服务程序入口
    	○ 中断处理
    		§ 通过压栈,保护软件现场
    		§ 开中断,因为CPU在响应中断时会自动关中断(IF=0),为了实现中断嵌套,需要开中断
    		§ 执行中断处理程序
    		§ 关中断,在恢复现场的过程中不希望被打扰
    		§ 恢复软件现场
    	○ 中断返回
    		§ 弹出断点地址→先弹出IP、再弹出CS
    		§ 恢复硬件现场
    		§ 开中断
    

    在这里插入图片描述

    3. 8088的中断系统

    在这里插入图片描述

    展开全文
  • 输入输系统——程序中断方式中断概念中断的产生程序中断方式的接口电路配置中断请求触发器和中断屏蔽触发器排队器中断向量地址形成部分程序中断方式接口电路的基本部分I/O中断处理过程CPU相应中断的条件和时间 中断...

    中断概念

    在这里插入图片描述

    中断的产生

    • 中断源:能够让CPU产生中断的所有指令
    • CPU与打印机共同工作原理:
      在这里插入图片描述

    程序中断方式的接口电路

    配置中断请求触发器和中断屏蔽触发器

    在这里插入图片描述
    INTR
    中断请求触发器
    INTR=1 有请求
    MASK
    中断屏蔽触发器
    MASK=1
    被屏蔽
    D完成触发条件

    排队器

    软件
    硬件:在CPU内部或在接口电路中(链式排队器)
    在这里插入图片描述

    中断向量地址形成部分

    入口地址查询:软件产生/硬件向量法(硬件—向量地址—入口地址)
    在这里插入图片描述

    程序中断方式接口电路的基本部分

    在这里插入图片描述

    I/O中断处理过程

    CPU相应中断的条件和时间

    • 条件
      允许中断触发器(EINT=1)
      开中断 :EINT=1
      关中断 :EINT=0
      硬件自动复位
    • 时间
      当D=1(随机)且MASK=0
      CPU每条指令执行阶段的结束前
      CPU发中断查询信号(将INTR设位“1”)

    I/O中断处理过程(以外部数据到CPU为例)

    1. CPU执行输入指令(外部数据到CPU)
    2. 设备地址选择设备(设备选择电路)
    3. CPU发送控制命令(接口译码)
    4. 2和3条件同时满足,B = 1,启动设别;D = 0,设别没有准备好
    5. 设备工作结束,外部设备数据传送到数据缓存寄存器中 B = 0;D = 1
    6. 屏蔽触发器为0 ,INTR中的D为1,中断查询触发器将INTR设置为1
    7. 启动排队器
    8. CPU发送中断相应信号
    9. 设别编码器发送向量地址
    10. 数据取走

    中断服务程序流程

    中断服务程序流程

    1. 保护现场(中断隐指令)(硬件完成)
      保护程序断点(指令地址的值和程序执行状态)
      寄存器内容的保护(进栈指令)
    2. 中断服务
      对不同的I/O设别具有不同内容的设备服务
    3. 恢复现场
      出栈指令
    4. 中断返回
      中断返回指令

    单重中断和多重中断

    • 单重中断:不允许中断线程的中断服务程序
    • 多重中断:允许级别高的中断源中断现行的中断服务程序

    单重中断和多重中断服务程序流程图

    在这里插入图片描述

    展开全文
  • 中断门和陷阱门的区别

    千次阅读 2012-11-27 22:27:36
    对于中断门,在转移过程中把IF置为0,使得在处理程序执行期间屏蔽掉INTR中断(当然,在中断处理程序中可以人为设置IF标志打开中断,以使得在处理程序执行期间允许响应可屏蔽中断); 对于陷阱门,在转移过程中保持...

    对于中断门,在转移过程中把IF置为0,使得在处理程序执行期间屏蔽掉INTR中断(当然,在中断处理程序中可以人为设置IF标志打开中断,以使得在处理程序执行期间允许响应可屏蔽中断);

    对于陷阱门,在转移过程中保持IF位不变,即如果IF位原来是1,那么通过陷阱门转移到处理程序之后仍允许INTR中断。

    因此,中断门最适宜于处理中断,而陷阱门适宜于处理异常。

    展开全文
  • 接口技术--中断技术

    2021-01-05 22:05:29
    中断的基本概念 CPU执行程序时,由于发生了某件随机的事件(外部或者内部),引起CPU杂书中断正在运行的程序,转去执行一段特殊的服务程序,以处理该事件,该事件...可屏蔽中断–INTR中断(CPU可以不响应) 非屏蔽中
  • 8086CPU在响应INTR中断时 A. 中断类型码等于8 B. 中断类型码等于16 C. 中断类型码由I/O提供 D. 中断类型码由CPU提供 正确答案:C 第2题:(单项选择题)(本题:1分) 8086CPU在响应INTR中断时,为了得到指向存放中断向量...
  •  ▼在Intel系列微处理器中,包括INTR和NMI(Non Maskable Interrupt)两个申请中断的引脚和一个响应INTR中断的引脚INTA。  ▼软中断有INT、INTO、INT3和BOUND。其中,INTO和BOUND为条件中断。  ▼IF(interrupt...
  • 中断门 陷阱门

    千次阅读 2006-01-08 20:08:00
    对于中断门,在转移过程中把IF置为0,使得在处理程序执行期间屏蔽掉INTR中断(当然,在中断处理程序中可以人为设置IF标志打开中断,以使得在处理程序执行期间允许响应可屏蔽中断);对于陷阱门,在转移过程中保持IF位...
  • INTR和INTE的区别

    千次阅读 2012-12-29 16:41:16
    INTR——中断请求信号,高电平有效  8255A输出的信号,可用于向CPU提出中断请求,要求CPU读取外设数据 INTE ——中断允许信号,高电平有效  用于控制中断允许或中断屏蔽
  • 在FSMC中,INT2~3和INTR引脚是三个外部中断,可高电平触发(EXTI没有的功能)、上升沿或下降沿触发。中断引脚分别是PG6、PG7和PF10。不打开相应的FSMC Bank(FSMC_PCRx_PBKEN=0)也能触发中断。其中上升/下降沿可...
  • 对于中断门,在转移过程中把IF置为0,使得在处理程序执行期间屏蔽掉INTR中断(当然,在中断处理程序中可以人为设置IF标志打开中断,以使得在处理程序执行期间允许响应可屏蔽中断);对于陷阱门,在转移过程中保持IF位...
  • 中断

    2015-01-12 21:40:00
    引起中断的因素:1,人为中断2,程序性事故,溢出等3,硬件故障4,IO设备5,外部事件中断请求标记和中断判优逻辑1,中断请求标记,中断请求触发器INTR为1,表示有中断源请求。2,中断判优逻辑,任何一个中断系统,...
  • 程序中断

    千次阅读 2016-08-30 17:02:28
    中断请求触发器(INTR),中断屏蔽触发器(MASK)二者成对出现。 接口中的完成触发器D,为1表示设备准备就绪。 中断源:凡是能够向CPU提出中断请求的各种因素都叫中断源。因此,有多个中断源,但是,CPU某一时刻只...
  • 系统中断

    2021-03-22 09:47:01
    1.什么是系统中断?... 可屏蔽中断:通过INTR线向CPU请求的中断,因外部设备产生的中断,但不会影响系统的正常运行,可以做一定的控制。 内部中断:陷入(在程序中预先设计,故意为之)、故障(程...
  • 硬件中断分为可屏蔽中断INTR和非屏蔽中断NMI cpu响应中断的条件 (1)cpu开放中断 IF=1(开放),IF=0(关闭中断) (2)cpu在现行指令结束后响应中断 中断处理步骤 (1)中断请求:中断源向CPU发出中断请求 (2)中断...
  • 中断中断描述符表

    2020-03-03 20:39:06
    外部硬件中断:从处理器外部来的中断信号,通过两个信号线INTR(可屏蔽中断)、NMI(非屏蔽中断)引入处理器;中断控制器8259芯片(PIC):每片8259只有8个中断输入引脚,在个人电脑上使用,需要两块(主片、从片);INTEL...
  • 中断技术

    2018-12-19 20:05:18
    INTR是高电平有效的信号 NMI是上升沿有效的信号 2. 外部可屏蔽中断响应的一般过程 (1)中断请求 (2)中断源识别及中断判优 中断源判优 (3)中断响应 cpu决定响应这个外部可屏蔽中断请求后,会在INTA端上连续的...
  • 关于中断

    2010-08-11 20:15:00
    8086有两条外部中断请求线:非屏蔽中断NMI和可屏蔽中断INTR。  外部中断:  出现在INTR线上的请求信号是电平触发的,它的出现是异步的,在CPU内部是由CLK得上升沿来同步的。在INTR线上的中断请求信号必须保持到...
  • 硬件中断分为可屏蔽中断INTR和非屏蔽中断NMI cpu响应中断的条件 (1)cpu开放中断 IF=1(开放),IF=0(关闭中断) (2)cpu在现行指令结束后响应中断 中断处理步骤 (1)中断请求:中断源向CPU发出中断请求 (2)中断...
  • x86中断架构

    千次阅读 2015-06-29 15:55:26
    x86计算机的 CPU 为中断只提供了两条外接引脚:NMI 和 INTR。1. 可编程中断控制器8259A8259A 只适合单 CPU 的情况。每个CPU都有一个本地APIC,所有本地APIC连接到IO APIC。主要是收集来自 I/O 装置的 Interrupt 信号...
  • uart_intr_test.rar

    2020-04-22 14:46:36
    基于microblaze的uart中断接收,用户自定义功能主要实现接收到11 22 返回AA BB 接收到22 33 返回 CC DD
  • PL_PS_intr.rar

    2019-05-23 21:11:33
    zynq中断例程。https://blog.csdn.net/MaoChuangAn/article/details/90485556
  • 8259中断实验

    2017-10-31 21:22:00
    利用系统总线上中断请求信号PCI_INTR,设计一个单中断应用。使用单次脉冲模拟中断产生。编写中断处理程序,在显示器屏幕上显示一个字符“9” 实验程序清单: INTR_IVADD EQU 003CH ;INTR对应的中断矢量地址 STACK1...
  • 中断和硬中断

    2013-04-15 15:37:32
    中断和硬中断 1、中断: ...通常被定义成一个事件,该事件改变处理器执行的指令顺序。...与一个中断控制器的输入引脚相连,中断控制器与cpu的intr引脚相连。 3、中断向量: 每个中断由0-255之间的一个
  • // 中断公共入口 1.1 common_interrupt: //所有可屏蔽中断函数的公共入口 SAVE_ALL //寄存器入栈 movl %esp,%eax // eax保存栈顶指针 ... jmp ret_from_intr //从中断返回 // 从中断返回 ...
  • 初始化中断

    2020-04-18 15:59:21
    Q&A Q1:并行和并发的区别? 并发:单位时间内累积的工作量 并行:同时进行的工作量 Q2:中断的分类?...从INTR信号线接收到的是可屏蔽中断,是诸如网卡,硬盘发出的中断, 从NMI信号线接收的是不可...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 309
精华内容 123
关键字:

intr中断