本文共 3629 字,大约阅读时间需要 12 分钟。
本文描述 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 被给你更新,用于 确定是哪个指令导致了调试事件 // 器必须读取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异常模式(特权)
转载地址:http://ljigi.baihongyu.com/