armv8-armv9中断系列详解-硬件基础篇

1001次阅读  |  发布于2年以前

目录

一 序言

1、序言

2、学习目标

二、硬件基础篇

1 中断的定义

2 FIQ和IRQ

3 中断术语的介绍

4 gic中断控制器的介绍

5 Core中的中断控制器接口的介绍

6 同步异常和异步异常的概念

6.1、同步异常和异步异常的定义

6.2、系统中有哪些异步异常?

6.3、系统中有哪些同步异常?

7 软件对中断的处理流程

8 向量表基地址寄存器的介绍

9 中断向量表的介绍

10 中断进入和中断退出时的硬件自动行为

10.1 当异常进来之后ARM CORE的硬件自动的行为(Exception entry)

10.2 当异常退出时ARM CORE的硬件自动的行为(Exception return)

11 中断的标记

12 中断的路由

13 中断的MASK(屏蔽)

14 中断路由(信号流)的总结

一、序言

1、序言

带着问题去学习,关于异常/中断的一些思考:

  • (1)、在如下的一个大系统种,cpu正在optee os中运行,突然来了一个想给Linux Kernel处理的中断(如一个蓝牙中断),那么此时的软硬件流程是怎样的?
  • (2)、在上述的大系统中,你的Linux Kernel、optee os、hypervisor、ATF系统中都有异常向量表,那么当一个中断到来时,是跳转到哪个系统中的向量表呢
  • (3)、什么是中断嵌套?怎样可以支持中断嵌套?什么是中断抢占?什么是中断优先级?什么是运行中断优先级?
  • (4)、什么是FIQ?FIQ和IRQ的关系是什么?
  • (5)、当来了一个中断,是如何跳转到向量表的?中间经过了怎样的路由?
  • (6)、当你调用了svc/hvc/smc指令后,cpu是如何跳转到你期望的目标地址的?
  • (7)、同步异常有哪些,异步异常有哪些,哪些优先级是一样的,哪些优先级是不一样的?
  • (8)、异常向量表存放在哪里?为什么会有人说放在0x00000000处?
  • (9)、什么是interrupt is asserted ?什么是interrupt is taken ?什么是PE Acknowledge this interrupt ?target 、routing又是什么意思?target from和target to呢?

做为一名底层安全工程师、一名一线支持客户的FAE,工作的内容涉及到TF-A、TEE、Linux Kernel、hypervisor、SPM等众多模块,cpu(或PE或core或PC)也会在这众多模块之间跳来跳去,由于这些代码大多数都是开源的,都是别人写好的,其实很多时候,也无需去看其底层的设计原理。但做为一名FAE,会遇到客户的灵魂一问,为了给客户一个专业的感觉,不得不去弄懂底层深层次的原理. 另外,有些时候遇到了性能相关问题,不懂底层的设计原理,也许就无法分析这类问题。

本人不是什么专家,也不是什么的大佬,也就是看了一些arm文档,加上自己的理解,然后总结出如下文章,当然我在总结的时候,一切都以官方资料为准,尽量不瞎说不乱说。。

最后,希望这系列文章,能够对大家有所帮助。好好学习、天天向上,卷起来同志们。

说明:

2、学习目标

二、硬件基础篇

1 中断的定义

有人说,中断就包含IRQ和FIQ,其实这是不准确的,准确的说法应该是:产生到aarch64的异步异常(包括IRQ, FIQ, SError) 可看作中断。官方文档原话 :IntheArmv8-A architecture,asynchronous exceptions that are taken toAArch64state are also knownasinterrupts.

2 FIQ和IRQ

有人说FIQ是快速中断, FIQ比IRQ具有较高的优先级,而且他还能提出ARM官方文档来证明他说的正确性:

其实,这也是错误的!

正确的说法是FIQ和IRQ具有同样的优先级(默认的情况下,我们只讨论armv8-aarch64和armv9)

3 中断术语的介绍

SPIs(Share Periphral Interrupts)中断进来之后,由inactive状态变成pending,此时中断标记为IRQ/FIQ,这是也就是中断assert了,然后该中断会根据HCR/SCR等的配置进行路由(路由到哪个Exception Level等),这个过程也就target,也可以叫做routing。路由之后,在部分场景下还会再检查PSTATE的MASK位,接下来就是PE acknowledge了,此时也就是中断被taken了。PE acknowledge后,cpu interface会将该中断置为Active.

4 gic中断控制器的介绍

(注意:本文重点介绍armv8/armv9异常中断,不会展开介绍gic,这里只是带一下简单概念) gic中断控制器有众多版本,gicv2/gicv3/gicv4是gic的架构,gic500/gic600是具体的gic IP。而在armv8/armv9中,基本都是使用的gicv3/gicv4。如下图所示,每一个core都定义了,它说使用的gic架构。

gic中断控制器与core连接的硬件框图

5 Core中的中断控制器接口的介绍

在gicv2中,gic中断控制器将中断信号(irq,fiq,serror)直接以signal的方式发送给core。而在gicv3中,gic的组件发生变化,将gic的cpu internface接口做到了core中,在这种情况下,gic将中断信号通过AXI Stream发送给core(cluster),然后cpu interface再继续发送irq/fiq/serror信息。

6 同步异常和异步异常的概念

6.1、同步异常和异步异常的定义

具备以下3个行为的称之为同步异常:• The exception is generated as a result of direct execution or attempted execution of an instruction. • The return address presented to the exception handler is guaranteed to indicate the instruction that caused the exception. • The exception is precise

其实就是说:

具备以下3个行为的称之为异步异常::• The exception is not generated as a result of direct execution or attempted execution of the instruction stream. • The return address presented to the exception handler is not guaranteed to indicate the instruction that caused the exception. • The exception is imprecise.

其实就是说:

那么precise 和 imprecise 又是什么意思呢??

比较绕、比较难懂,咱们换一个说法:按照预期产生的异常称之precise,反之imprecise

6.2、系统中有哪些异步异常?

其实主要就是:irq, fiq, SError

Physical interrupts Are signals sent to the PE from outside the PE. They are:

Virtual interrupts Are interrupts that software executing at EL2 can enable and make pending. A virtual interrupt is taken from EL0 or EL1 to EL1. Virtual interrupts have names that correspond to the physical interrupts:

6.3、系统中有哪些同步异常?

7 软件对中断的处理流程

正常情况下,当一个中断(异常)进来之后,PE(cpu)跳转到中断向量表,在中断向量表中会再次调用C语言函数,完成中断的处理,流程图如下所示:

ARM Core支持中断抢占,当一个中断正常处理的时候,可能又触发了一个高优先级的中断,示例如下所示:

思考你所用的操作系统就真的支持中断嵌套吗?如果想支持中断嵌套,需要满足哪些条件呢?后文会有详细介绍。

8 向量表基地址寄存器的介绍

armv8定义了VBAREL1、VBAREL2、VBAR_EL3三个基地址寄存器

思考:1、VBAREL1、VBAREL2、VBAREL3写入的基地址,是物理地址还是虚拟地址?2、基地址不再放0x00000000的位置吗?3、异常向量表中,没有reset offset了?4、异常向量表中的每一个offset为啥是0x80(128)地址空间?以前是多少?5、VBARELx中,为啥末尾11个bit是reserved?

9 中断向量表的介绍

我们可以看出,实际上有四组表,每组表有四个offset,分别对应sync,IRQ,FIQ和serror。

另外我们还可以看到的一点是,每一个异常入口不再仅仅占用4bytes的空间,而是占用0x80 bytes空间,也就是说,每一个异常入口可以放置多条指令,而不仅仅是一条跳转指令

注意,到了armv9上,增加了 FEAT_DoubleFault之后,异常向量表稍微变化了一丁点变化,如图中的标注所示:

也就是说,当 FEAT_DoubleFault开启之后,且 SCR_EL3.EASE比特设置为1, 那么此时target到EL3的 Synchronous External abort将会跳转到Serror offset。

在中断产生之后,PC(或PE 或 Core 或 cpu)将跳转到VBAR + 中断offset处。事实上在armv8-aarch64或armv9体系中,有3个VBARELx寄存器,另外对于VBAREL1虽然只有一个,但是在不同Security状态的操作系统中,有着不同的cpu context,即也是可以看做成两份。如果是要考虑虚拟化,那么VBAREL2可能也会有两份,VBAREL1可能会有多份。

如下,是在不考虑EL2/虚拟化的时候,画的一张向量表总截图,即当一个中断来时,硬件会自动选择哪一个VBAR_ELx寄存器,硬件会自动选择哪一组向量表,硬件会自动选择哪一个offset

10 中断进入和中断退出时的硬件自动行为

10.1 当异常进来之后ARM CORE的硬件自动的行为(Exception entry)

[for common]

[for 同步异常]

[for Serror]

[for FEAT]

10.2 当异常退出时ARM CORE的硬件自动的行为(Exception return)

(On executing an Exception return instruction at ELx)

11 中断的标记

在gicv3中断控制器中,对中断进行了分组:Group0、Secure Group1、Non-secure Group1。当一个中断进来的时候,cpu interface会根据中断的分组类型和当前PE的security状态来决定是标记为IRQ还是FIQ

12 中断的路由

我们知道系统中有三个基地址VBAREL1、VBAREL3、VBAREL1(secure),那么到底是使用哪一个呢?由Routing when both EL3 and EL2 are implemented 表来决定,中断routing到了EL1则使用VBAREL1,routing到了EL3则使用VBAREL3,routing到了secure EL1则使用VBAREL1(secure)

为了更直观的理解,总结成了下面的一个流程图:

13 中断的MASK(屏蔽)

在PSTATE中,A/I/F比特分别可以对SError、IRQ、FIQ进行MASK

但是在有些场景下,MASK将会失效,如在一些中断被强制target到EL3的配置下,中断的taken就不在关心PSTATE的mask位了。

以下表格做出了详细的说明:

其中:

14 中断路由(信号流)的总结

当peripheral产生一个中断后,PE是如何跳转到某个系统中的向量表的?如下框图展示了这一切:当一个中断到来后,中断信号交给gic,gic会进行中断的识别、优先级、affinity路由等,然后通过AXI stream将信号交给core(cpu internface),cpu interface负责标记中断是irq还是fiq,这就是中断断言了(assert了),然后就是中断的路由规则,target到相应的EL级别,然后再检查Mask标记位,然后该中断就被taken了(即PE acknowledge了),接下来PE还会根据EL是否发生改变、SPELx使用的哪一个等信息来决定是跳转到哪一组向量表 最后PE跳转到相应的VBARELx + xxx offset了。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8