繁体   English   中英

我可以使用ARM的LDR指令访问什么地址

[英]What address I could access with LDR instruction of ARM

我是ARM汇编代码的新手。

我刚检查了指令集,发现有一条指令LDR可以用作“LDR {} {} Rd,”。

关于这条指令,我有两个问题:1)这里的地址是物理地址还是虚拟地址? 2)我怎么知道加载哪个地址“合法”或“可读”? 我不知道我可以访问哪个地址。

我只是想测试这条指令,所以任何有效的地址对我都有帮助。

非常感谢你。

这取决于程序运行的ARM架构究竟是什么。 如果它是像Cortex-M0这样的小型微控制器(ARMv6-M),则使用物理地址。 在特定处理器的参考手册中,您可以检查哪些地址有效(例如,RAM的地址范围是什么)。 您还需要记住,通常地址必须与字大小对齐(同样,它取决于架构的特定版本)。

如果您使用“大”ARM处理器,如Cortex-A(ARMv7-A)或64位ARM(ARMv8-A)之一,您还使用(最可能)某种高级操作系统(例如Linux)和处理器本身有一个MMU。 在这种情况下,您传递虚拟地址。 如果使用带有标准3:1拆分的32位Linux,则所有低于0xC0000000的地址(已对齐)都可供用户空间程序访问。 顺便说一句,您可以使用其他指令(如LDRB,LDRH)访问未对齐的地址。

如果您正在使用Linux, 我的文章可能会有所帮助。 这篇文章目前相当混乱,但至少在内部有一组很好的外部链接到其他文章。

ARMv7-A -R Architecture Reference Manual明确指出

指令中使用的地址,作为数据或指令地址,是虚拟地址(VA)。

PC,LR或SP中保存的地址是VA。

VA映射从零到VA空间的大小。 对于ARMv7,最大VA空间为4GB,最大VA范围为0x00000000 - 0xFFFFFFFF。

同样很清楚,该VA被转换为物理地址,而物理地址又用于利用物理存储器执行期望的操作。 进一步说明了禁用内存管理单元(实际内存映射)的影响,但这并没有否定地址是虚拟地址的事实。

使用最新的ARM体系结构,除非您正在编写内核(必须处理设置分页和地址转换),否则您将使用虚拟地址进行操作。 如果您在某些操作系统下运行代码,那么您就是安全的。

这导致您回答第二个问题。 当您受到操作系统的保护时,您可以自由尝试访问您希望的任何地址,但在最坏情况下访问随机地址将导致操作系统终止您的特定应用程序。 要确定您可以访问哪些地址,可以尝试在gdb下运行程序,并使用info proc mappings gdb命令列出所有映射的内存。

  1. 除非您正在编写内核/引导加载程序代码,否则所有地址始终是虚拟的。 即使您愿意,也不能使用物理地址。 (假设您正在编写将在Linux等全面操作系统下运行的用户空间代码。更一般地说,要么总是拥有虚拟地址,要么总是拥有物理地址。您不能编写使用某些物理地址的代码。虚拟内存访问。如果要对某个物理地址执行某些操作,则必须将其映射到虚拟地址空间。)

  2. 当OS启动进程时,堆栈指针通常指向有效内存。 您放入数据或bss段的任何内容也应该是可读的。

除此之外的任何事情都超出了单一答案的范围。 谷歌上了一个介绍教程。

但是,由于你特别提到了ldr ,它不仅仅是一个简单的指令(将编译时常量放入寄存器的加载或伪指令):请参阅为什么在ARM中使用LDR而不是MOV(反之亦然)部件?

我真的不知道ARM asm,我没有意识到答案是特定于arch的。 1.和2.适用于所有CPU上的用户空间代码(在具有受保护内存的普通操作系统上)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM