max*_*xbc 6 kernel arm mmu arm64 armv8
我在armv8(aarch64)中编写了一个简单的内核。
MMU配置:
我正在将新的地址空间(从1 << 40开始)映射到一些空闲的物理区域。当我尝试访问地址1 << 40时,出现异常(类型为“使用SP1的EL1,同步”):
ESR_EL1=0x96000044
FAR_EL1=0xffff010000000000
Run Code Online (Sandbox Code Playgroud)
检查其他寄存器,我有:
TTBR1_EL1=0x82000000
TTBR1_EL1[2]=0x0000000082003003
Run Code Online (Sandbox Code Playgroud)
因此,基于《 ARMv8的ARM体系结构参考手册》(ARMv8-A配置文件):
因此,转换在0级失败,而在0级应该失败。
我的问题是:我做错什么了吗?我是否缺少一些可能导致翻译错误的信息?而且,更一般而言,如何调试翻译错误?
更新:
在启用MMU之前我写表时一切都正常。
每当我在启用MMU之后(通过平面映射表区域)写入表时,映射就永远无法进行。我不知道为什么会这样。
我还尝试了手动写入选定的表(以消除我的mmapping函数的任何副作用):相同的结果(当在MMU开启之前完成写操作时,它会起作用;而在失败之后,它会失败)。
我尝试进行操作tlbi和dsb sy说明,其后isb没有效果。此时只有一个CPU正在运行,因此缓存应该不是问题-编写指令和MMU可以访问相同的缓存(但我将在下一步进行测试)。
我忽略了单个内核中的缓存问题。问题是,在打开MMU之后,CPU和走台装置的内存视图不同。《 ARMv8 Cortex-A编程指南》指出,在修改表之后,必须清除/使缓存无效以达到统一点(单个内核的相同视图)。
有两种可能性可以解释这种现象(我还不完全了解缓存的工作原理):
dsb指令仅等待所有内核具有同步状态(由于一致性网络):其他内核将知道必须更新该行,以及何时他们尝试访问它,将其更新为L2或从以前的内核的L1迁移到其L1。因此,我仍然不确定到底是什么引起了该问题,但是清除/使所有更新的地址无效是可行的。
| 归档时间: |
|
| 查看次数: |
4295 次 |
| 最近记录: |