首页 > 解决方案 > EL2中读/写内存的问题

问题描述

我正在尝试在 EL2 中读/写内存,但它没有返回我想要的。

我使用kzalloc来获取初始化空间,然后使用str在这个空间中写入一个数字(0x12345678)。

接下来,我使用__pa()来获取这个空间的物理地址(PA)。我发现 PA=VA-0x80000000。我会将这个 PA 发送到 EL2 读取,所以我将它放入一个寄存器(r1

第三步是调用hvc,调用hvc后它在 EL2 中。我在hyp_stub_vectors中创建了一个分支(在arch/arm/kernel/hyp-stub.S中,我确信该文件将处理hvc),并使用ldr读取此内存空间以获取我的号码。

但它失败了。

我想可能的原因是

  1. 我的__pa()物理地址错误。但是我走aarch32 stage-1翻译,得到了相同的地址,其实这个空间是一个block,所以删除一个offset得到物理地址就可以了。
  2. 在 EL2 中它仍然有地址转换。但是我检查了一些相关的系统寄存器,发现 EL2 中的 MMU 是禁用的。可能我检查了错误的寄存器?

我的设备是 Raspberry Pi 3B+,Cortex-A53

标签: memory-managementarmvirtualizationarmv8

解决方案


该问题可能与缓存不一致有关。鉴于您的 EL2 在禁用 MMU 的情况下运行,它也禁用了数据缓存,如本文所述。这意味着要访问 EL2 中的内存位置,您需要将值放入 RAM。

为此,您可以使用dc civac, x0指令x0作为变量的虚拟地址。这将使用您的变量刷新缓存行并将值写入 RAM。

PS 要验证您的 PA 是否正确,请读取 at 的值__va(__pa(addr))并确保它是相同的。


推荐阅读