【ARMv8 异常模型入门及渐进 9 - FIQ 和 IRQ 区别】
文章目录
- 1.1 IRQ 与 FIQ 区别
- 1.1.1 ARMv7 中断向量表
- 1.1.2 FIQ 与 IRQ 差异
- 1.1.3 Linux 禁用 FIQ
- 1.2 ARMv8 FIQ 介绍
1.1 IRQ 与 FIQ 区别
1.1.1 ARMv7 中断向量表
向量表中保存了一系列的跳转指令,当系统发生异常时,由处理器负责将程序执行流转到向量表中的跳转指令,最常见的就是中断向量,应用工程师只需要使用固定的函数名编写中断处理程序,在中断发生时该中断处理程序就会被自动调用,这背后的实现就是中断向量表的功劳。
在 armv7 中,中断向量表可以设置在两个地址:0x00000000
和 0xffff0000
,由协处理器 cp15 的 SCTLR
的 bit13
来控制,默认情况下,中断向量表的位置在 0x00000000
,实际上,对于操作系统而言,比如 linux,会更倾向于将中断向量表放在 0xffff0000
处,因为 0x0 处在用户空间下,需要额外做一些限制,而 0xffff0000
处在内核空间,另一方面,0
地址通常是 NULL
指针访问的地址,这需要 MMU 做相应的访问限制规则,总之,将向量表放在高地址处会更方便。
armv7 架构中向量表地址内容见下表:
对于ARMv7 linux 的中断向量表的定义在 arch/arm/kernel/entry-armv.S 中:
.L__vectors_start:W(b) vector_rst /* reset mode */W(b) vector_und /* undefined mode */W(ldr) pc, .L__vectors_start + 0x1000 /* svc mode */W(b) vector_pabt /* abort mode (prefetch abort) */W(b) vector_dabt /* abort mode (data abort) */W(b) vector_addrexcptn /* unused */W(b) vector_irq /* irq mode */W(b) vector_fiq /* fiq mode */
当对应的 exception event
发生时,系统会自动地修改 CPSR 状态寄存器,并跳转到上表中的地址执行指令,而软件上要做的,就是在该地址上放置对应的代码,除了 FIQ 之外,其它模式对应的都是一条跳转指令,如果存放多于 4 字节的指令,将会覆盖调用后续的异常向量,因为 FIQ 是最后一条异常向量,根据其特殊性,FIQ 的处理指令可以直接放置在以 0xffff001c
处,当然,具体怎么做由软件的实现来决定。
1.1.2 FIQ 与 IRQ 差异
IRQ 与 FIQ 是 ARM 处理器的两种不同编程模式(ARMv7 Cortex-A 系列 有 7 种处理模式)。
IRQ (Interrupt Request):指中断模式;
FIQ (Fast Interrupt Request):指快速中断模式。
具体差异如下
- 对 FIQ 来说系统必须进快处理中断请求并并快速离开这个模式;
- FIQ 的优先级比 IRQ 高,IRQ 可以被 FIQ 所中断,但 FIQ 不能被 IRQ 所中断;
- FIQ 模式下,比 IRQ 模式多了几个独立的寄存器。ARM 在编译的时候,如果 FIQ 中断处理程序足够用这几个独立的寄存器来运作,它就不会进行通用寄存器的压栈,这样也省了一些时间;
- FIQ 的中断向量地址在
0x0000001C
,而 IRQ 的在0x00000018
。(也有的在FFFF001C
以及FFFF0018
)。0x18
只能放一条指令,为了不与0x1C
处的 FIQ 冲突,这个地方只能跳转,而 FIQ 不一样,0x1C
以后没有任何中断向量表了,这样可以直接在0x1C
处放 FIQ 的中断处理程序,由于跳转的范围限制,至少少了一条跳转指令; - IRQ 和 FIQ 的响应延迟有区别,IRQ 的响应并不及时, 会延迟几个指令周期才跳转到中断向量处,应该是在等预取的指令执行完。
1.1.3 Linux 禁用 FIQ
FIQ 在 linux 中并没有使用到,如上节内容提到的 FIQ 相对于 IRQ 而言,FIQ 拥有更高的优先级,它可以抢占 IRQ 的执行,同时 FIQ 本身的执行速度比 IRQ 要快一些,这类中断通常用在对响应时间有极高要求的系统中,比如 armv7-R 系列的处理器中会使用到。FIQ 的快速执行一方面体现在它有更高的优先级,另一方面,它拥有单独的寄存器,省去了参数的压栈时间,且处于中断向量表的最后一项,其执行代码不需要经过跳转。
至于为什么 linux 中不使用 FIQ,同时禁止 IRQ 中断的嵌套,这是因为支持中断的嵌套会给系统带来更大的复杂性,同时,过多中断的嵌套很可能导致栈的溢出,另一方面,随着硬件的发展,系统性能的瓶颈并不受限于中断的处理,当然,禁止 FIQ 以及中断的嵌套会略微地降低实时性,但是明显它带来的那点实时性提升并不足以弥补它所带来的缺点,两相权衡之下,在新版的内核中便取消了中断嵌套的支持(老版本中是支持的)。
1.2 ARMv8 FIQ 介绍
TODO
推荐阅读:
https://zhuanlan.zhihu.com/p/362717490
【ARMv8 异常模型入门及渐进 9 - FIQ 和 IRQ 区别】相关推荐
- 【ARMv8 异常模型入门及渐进2 - 系统寄存器访问方法:op1,CRn,CRm,op2】
文章目录 1.1 ARMv8 系统寄存器访问概要 1.1.1 系统寄存器访问级别 1.1.2 ARMv8 系统寄存器编码 1.1 ARMv8 系统寄存器访问概要 ARMv8中,取消了协处理器,之前协处 ...
- fiq中断的入口地址_FIQ和IRQ区别
FIQ 和 IRQ 区别 FIQ 和 IRQ 是两种不同类型的中断, ARM 为了支持这两种不同 的中断,提供了对应的叫做 FIQ 和 IRQ 处理器模式( ARM 有 7 种处 理模式) .一般的中 ...
- 从LeNet-5 CNN模型入门PyTorch
从LeNet-5 CNN模型入门PyTorch 1. PyTorch 准备 1.1 PyTorch特点 1.2 PyTorch安装测试 2. 完整代码 2.1 LeNet模型 2.2 训练 2.2 测 ...
- STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(3):Cortex-M3处理器异常模型
这一部分描述异常模型. 每一个异常都存在一个状态: 闲置 这个异常没有活跃,没有暂停 待进行 异常等待被处理器服务.一个外设或软件中断请求可以改变相应中断的状态到即将发生状态. ·活 ...
- 因果模型一:因果模型入门综述
因果模型一:因果模型入门综述 一. 为什么要研究因果模型? 二. 因果研究的发展历程 1. C.G. Hempel 1984--因果研究的分水岭 2. 统计相关性模型 3. 虚假原因 三.INUS条件 ...
- 第19章 随机波动率模型入门
这学期会时不时更新一下伊曼纽尔·德曼(Emanuel Derman) 教授与迈克尔B.米勒(Michael B. Miller)的<The Volatility Smile>这本书,本意是 ...
- 为什么 FIQ 比 IRQ 的响应速度更快?
目录 1.FIQ在异常向量表位于最末 2.FIQ模式有5个私有寄存器 3.FIQ的优先级高于IRQ 1.FIQ在异常向量表位于最末 一般来说,处理器跳转到异常向量表以后,会根据当前的异 ...
- FIQ和IRQ的区别及CPU实现
FIQ和IRQ是两种不同类型的中断,ARM为了支持这两种不同的中断,提供了对应的叫做FIQ和IRQ处理器模式(ARM有7种处理模式). 一般的中断控制器里我们可以配置与控制器相连的某个中断输入是FIQ ...
- IRQ中断与FIQ中断的区别
在学习嵌入式的时候中断是我们必须要了解的东西. 首先我们要知道什么是中断,中断的概念(可看可不看,重要的是理解)是指半中间发生阻隔.停顿或故障而断开.其实中断也是异常的一种,只是是一种人为可控的异常. ...
最新文章
- MySQL Antelope和Barracuda的区别分析
- ip and port check 正则
- mysql出现多线程操作同一个表的情况,应该怎么办?
- Tomcat 安装与使用
- 向朋友借钱:文章值得一读,让人思索良久
- Oracle01877,Cognos错误:RQP-DEF-0177 执行操作“sqlOpenResult”(状态为“-28”)时出错...
- shell 应用场景及工作原理
- 11-6-线程的概念
- python 菜鸟-Python 元组
- 数据库db2错误代码大全
- Unicode与GBK互转
- 最新《圣思园JavaSE实地培训系列教程》
- hdjs-图片 文件上传
- 美团8年经验之谈,测试工程师如何进阶(自动化、性能、测开)
- springboot+社区购物小程序 毕业设计-附源码291720
- bp是什么意思贷款利率,lpr+bp利率是什么意思
- 流量不清零、可转赠,对运营商未必是坏事
- 基于知识图谱推荐系统
- 程序人生hello-P2P
- Holm–Bonferroni method