在制作页表之后,我已经在 ARMv8 上运行了虚拟内存。奇怪的是,我的大部分翻译都在工作(身份映射),除了位于物理地址零的 Flash。我使用一个编辑页表的函数,所以有些工作有些不工作对我来说很奇怪。具体来说,我只映射了几个范围:
Flash [0x00000000, len = 0x08000000]
UART [0x09000000, len = 0x1000 ]
RAM [0x40000000, len = 0x0fe00000]
Secure RAM [0x4fe00000, len = 0x00200000]
再说一次,除了 Flash ,它们都可以工作。我的映射功能也适用于非身份映射。Flash 系列有点奇怪。
我有一个异常处理程序用于剖析问题。我在捕获Data Abort
异常时发现了两个有趣的案例。根据访问的内存类型,我遇到了两种 Data Abort 子类型:
- [1] Flash address range (e.g. 0x00000000)
- ESR.ISS = 0x10 (ISS.DFSC = 0x10)
- Synchronous External abort, not on translation table walk
- [2] An expected unmapped address (e.g. 0x50000000)
- ESR.ISS = 0x06 (ISS.DFSC = 0x06)
- Synchronous External abort, on translation table walk, level 2
当尝试处理访问地址的异常时,我不希望出现在表中,我得到一个 [2] (第 2 级错误,因为映射了一些附近的地址)。
当我尝试处理访问 Flash 的异常时,我确实希望在表中出现 [1](不在表中)。
所以,我对这两种情况代表什么感到困惑。[1] 和 [2] 有什么区别?它们似乎代表着同样的东西。[1] 是否以某种方式代表了翻译在尝试之前失败的情况?如果是这种情况,我希望处理已定义的 0 级故障。对于我不希望出现在表中但收到另一个地址的地址,我期待“不在表中”错误。