本文描述 armv6 异常 中的 data abort 和 instruction fetch abort
ARMv6 异常 7种
reset 和 swi 共享 SVC异常模式(特权)
data abort 和 instruction fetch abort 共享 ABT异常模式(特权)
attempted execution of an Undefined instruction UND异常模式(特权)
IRQ, normal interrupt IRQ异常模式(特权)
FIQ, fast interrupt FIQ异常模式(特权)
ARMv6 非异常 2种
user user模式(非特权)
system system模式(特权)
中止
在 内存访问流程中 ,ARM处理器可能会发生异常
异常的原因是中止(异常的访问),中止分为三种:
MMU faults(4种)
MMU检测到限制并向处理器发送信号。
Debug abort
监视器调试模式已启用,并且检测到断点或监视点。
External abort(三种)
外部内存系统发出非法或错误的内存访问信号。
异常发生时,记录相关的上下文信息 在 register 5 和 register 6 中。
本文中描述的 中止 会导致 什么异常?
MMU faults
如果中止的内存请求是指令获取,则当处理器尝试执行与中止的访问对应的指令时,将引发预取中止异常。
如果中止的访问是数据访问或缓存维护操作,则会引发数据中止异常。
Debug event
当启用监视调试模式时 , 可以由于 指令访问上的breakpoint 而执行中止, 产生 预取中止异常
当启用监视调试模式时 , 可以由于 数据访问上的watchpoint 而执行中止, 产生 数据中止异常
External abort
指令获取时的外部中止 , 可能会产生 预取中止异常(依据是否执行)
数据读/写时外部中止 , 会产生 数据中止异常
硬件页表遍历上的外部中止 , 会产生 数据中止异常
中止详细解读
如果MMU检测到中止,不会对检测到中止的地址进行外部访问。
异常访问源分类:
如果中止的内存请求是指令获取,则当处理器尝试执行与中止的访问对应的指令时,将引发预取中止异常。
问题: 如果MMU检测到中止,不会对检测到中止的地址进行外部访问 ,那么 指令没有预取成功, 怎么会尝试执行呢???
有关预取中止的详细信息,请参阅第A2-16页的异常。
如果中止的访问是数据访问或缓存维护操作,则会引发数据中止异常。
有关数据中止的详细信息,请参阅第A2-16页的异常。
faults检查顺序
MMU用于检查访问faults的顺序在节和页上略有不同。
第B4-15页的图B4-2显示了两种访问类型的顺序。
MMU产生四种类型的faults:
alignment fault
For details of when alignment faults are generated, see Table A2-10 on page A2-40
translation fault
翻译错误有两种类型:
段
如果第一级描述符被标记为无效,则生成此项。
当描述符的位[1:0]都是0时,就会发生这种情况;
或VMSAv6中, 描述符的位[1:0]值为0b11(保留值)
页
如果第二级描述符被标记为无效,则生成此项。
如果描述符的位[1:0]都是0,就会发生这种情况。
会不会刷新 TLBs
页表条目(PTE) fetches 会导致翻译错误,保证不会更新 TLBs .
翻译错误时刷新损坏的条目不需要TLB维护操作 .
domain fault
有两种类型的域故障:
区段域故障
返回有效的第一级描述符时 检查域。
页域错误
返回有效的第二级描述符时 检查域.(基于一级描述符的域字段)。
会不会刷新 TLBs
如果域错误导致对关联页表的更新,则需要刷新相应的TLB条目以确保正确性。
有关详细信息,请参阅第B2-22页上TLB维护操作和内存顺序模型中的页表条目更新示例。
内存顺序模型 相关
对域访问控制寄存器的更改通过执行预取刷新操作(或由于异常或异常返回)进行同步。
参见对CP15寄存器和存储器顺序的更改模型见第B2-24页。
permission fault
检查时机:
如果两位域字段返回client(01),则对TLB条目中的access permission字段执行权限访问检查。
会不会刷新 TLBs
如果权限错误导致对关联页表的更新,则需要刷新相应的TLB条目以确保正确性。
有关详细信息,请参阅第B2-22页上TLB维护操作和内存顺序模型中的页表条目更新示例。
中止发生时机:
当启用监视调试模式时 , 可以由于 指令访问上的breakpoint 或 数据访问上的watchpoint 而执行中止。
指令访问上的breakpoint
FSR 被更新(指令或数据)用以指示调试中止
R14_abt 被更新 用于确定失败指令的地址
数据访问上的watchpoint
WFAR 被给你更新,用于 确定是哪个指令导致了调试事件
R14_abt 不能用于判断失败指令的地址
谁发出的 中止
外部存储器错误是指发生在存储器系统中而不是由MMU检测到的那些错误。
外部内存错误很少见,并且可能会对正在运行的进程造成致命的影响。
例子
L2内存结构上的不可纠正奇偶校验或ECC故障。
实现定义
它是实现定义的,如果有的话,支持外部中止。
概念
精确: 硬件 设置的 R14_abt 是更新的.
更新的寄存器
DFSR或IFSR中会发出精确外部中止的信号。
有关不精确外部中止模型的更多详细信息,请参见第A2-23页的不精确数据中止。
指令获取时的外部中止
存储器系统向ARM处理器发出存储器中止(Abort)信号,预取的指令被记为无效.
是否精确
指令预取期间外部生成的错误本质上是精确的
是否会导致异常产生
如果指令未被执行,则预取指令中止不会发生。
当CPU试图执行从导致错误的位置获取的指令时,预取指令中止会发生.
更新的寄存器
不更新 Fault Address register
数据读/写时外部中止
数据读写过程中外部生成的错误可能不精确。
在这种中止的情况下进入中止处理程序时,不能保证 R14_abt 中存在 与导致异常的指令相关的地址
相应地,外部中止可能无法恢复
1. 中止状态不是重新进入
如果不精确的外部中止导致进入中止状态,而中止状态不是重新进入,则处理器处于不可恢复状态,因为R14和SPSR值已损坏。
2. 中止状态是重新进入
由于这个原因,只有在中止状态重新进入时,处理器才会识别出不精确的外部中止。
这是通过在CSPR中为不精确的外部中止提供一个掩码来管理的,这个掩码称为位。
更新的寄存器
更新 DFSR
不更新 FAR
硬件页表遍历上的外部中止
在硬件页表访问上发生的外部中止必须与页表数据一起返回。
这样的中止是精确的。
更新的寄存器
更新FAR
更新FSR(指令或数据)
奇偶校验错误报告
是否精确
奇偶校验错误可以作为精确(例如,从一级缓存命中读取)或不精确(例如,缓存线填充)中止发生
定义了什么
架构定义了
1.用于报告奇偶校验错误的故障状态代码
实现定义了
1.提供哪些奇偶校验错误支持
2.是否使用指定的故障状态代码或其他适当的编码来报告它们
本文主要讲述了 内存系统相关的异常 的原因(中止)的 分类,对应 data abort 和 instruction fetch abort 共享 ABT异常模式(特权)
访存异常产生的流程图
- Figure B4-2 Sequence for checking faults
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/dd26bb38d2bd84f5741e381ae6fcc247.png)