在AArch64状态下访问AArch32寄存器

发布于 2025-01-09 05:24:24 字数 475 浏览 1 评论 0原文

我在学习ARMv8异常处理的时候看到了下面这句话:

当从 AArch32 到 AArch64 进行异常处理时,有一些特殊的注意事项。 AArch64 处理程序代码可能需要访问 AArch32 寄存器,因此架构定义了映射以允许访问 AArch32 寄存器。

还有银行地图:

registerbankingmap

所以我想问:

  1. 什么时候以及为什么我们需要在AArch64状态下访问AArch32寄存器?
  2. 这个映射表对程序员可见吗?编码时是否需要写相应的Wn?或者只是Rn

I saw the following sentences when learning ARMv8 exception handing:

When taking an exception from AArch32 to AArch64, there are some special considerations. AArch64 handler code can require access to AArch32 registers and the architecture therefore defines mappings to allow access to AArch32 registers.

And there is the banking map:

register banking map

So I want to ask:

  1. When and why we need to access AArch32 registers in AArch64 state?
  2. Is this mapping table visible to programmers? Whether we need to write corresponding Wn when coding? or just Rn?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

瞳孔里扚悲伤 2025-01-16 05:24:24

典型的用例是希望能够运行 32 位 ARM 应用程序的 64 位操作系统。它将在 AArch32 状态下在 EL0 上运行应用程序,而操作系统在 AArch64 状态下在 EL1 上运行。

假设32位应用程序需要进行系统调用。它将在 AArch32 寄存器中设置参数并导致 svc / swi 发生异常。操作系统的异常处理程序在 AArch64 状态下在 EL1 上运行,需要能够检索这些寄存器的内容以正确处理系统调用。因此,映射告诉它,例如,应用程序写入 r1 的任何内容都将在 x1 中找到。

编写代码时,您只需使用您正在编写的状态(AArch32/AArch64)中可用的任何寄存器集。对于 32 位代码,您编写 r0、r1、r2 等,对于 64 位代码,您使用 w0/x0、w1/x1 等。对于应用程序编程,映射是无关紧要的,只有在您编写需要在两种状态之间进行交互的操作系统代码。

A typical use case would be a 64-bit operating system that wants to be able to run 32-bit ARM application programs. It would run the application at EL0 in AArch32 state, while the OS runs at EL1 in AArch64 state.

Suppose the 32-bit application needs to make a system call. It will set up the arguments in the AArch32 registers and cause an exception with svc / swi. The OS's exception handler, running at EL1 in AArch64 state, needs to be able to retrieve the contents of those registers to process the system call appropriately. So the mapping tells it, for instance, that whatever the application wrote to r1 will be found in x1.

When writing code, you simply use whatever register set is available in the state (AArch32/AArch64) you are writing for. For 32-bit code you write r0, r1, r2, etc, and for 64-bit code you use w0/x0, w1/x1, etc. For application programming, the mapping is irrelevant, and only comes into play if you are writing OS code that needs to interface between the two states.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文