memory-management - 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读取此内存空间以获取我的号码。
但它失败了。
我想可能的原因是
- 我的__pa()物理地址错误。但是我走aarch32 stage-1翻译,得到了相同的地址,其实这个空间是一个block,所以删除一个offset得到物理地址就可以了。
- 在 EL2 中它仍然有地址转换。但是我检查了一些相关的系统寄存器,发现 EL2 中的 MMU 是禁用的。可能我检查了错误的寄存器?
我的设备是 Raspberry Pi 3B+,Cortex-A53
解决方案
该问题可能与缓存不一致有关。鉴于您的 EL2 在禁用 MMU 的情况下运行,它也禁用了数据缓存,如本文所述。这意味着要访问 EL2 中的内存位置,您需要将值放入 RAM。
为此,您可以使用dc civac, x0
指令x0
作为变量的虚拟地址。这将使用您的变量刷新缓存行并将值写入 RAM。
PS 要验证您的 PA 是否正确,请读取 at 的值__va(__pa(addr))
并确保它是相同的。
推荐阅读
- html - 如何阻止 mat-table 调整其列的大小?
- machine-learning - Pytorch DataLoader 流水线
- vega-lite - 在悬停/选择时更改 vega lite 密度图颜色
- symfony - 使用 Symfony/FOSUserBundle,如何将锁定的用户重定向到登录表单以外的页面?
- mysql - 通过 Join 连接的表与通过 Where 连接的表
- android - 如何从网站上获取图标 google material design?
- python - 预期dense_3 的形状为(2,),但得到的数组形状为(1,) 使用Keras 进行图像分类(Maleria deases)
- javascript - 如何修复错误 TypeError: Cannot read property 'map' of undefined
- ffmpeg - FFMPEG 返回负值并停止渲染
- java - 去除字符串中空格的方法