如何解决关于在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转换并获得了相同的地址,实际上这个空间是一个块,因此可以删除偏移量以获得物理地址是可以的。
- 在EL2中,它仍然具有地址转换。但是我检查了一些相关的系统寄存器,发现EL2中的MMU已禁用。可能我检查了错误的寄存器?
我的设备是Raspberry Pi 3B +,Cortex-A53
解决方法
该问题可能与缓存不一致性有关。假设您的EL2在禁用MMU的情况下运行,那么它也已禁用数据缓存,如this paper中所述。这意味着要访问EL2中的存储位置,您需要将该值放入RAM。
要实现此目的,可以使用dc civac,x0
指令,其中x0
是变量的虚拟地址。这将用您的变量刷新缓存行,并将该值写入RAM。
P.S。要验证您的PA是否正确,请读取__va(__pa(addr))
上的值,并确保该值相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。