问题标签 [armv8]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
928 浏览

c - 使用内联 ARM 程序集检索时钟周期

我正在玩一些 C 参考代码,它带有自己的基准测试程序。不幸的是,基准测试代码有一行内联 x86 汇编,我正在尝试在 AArch64 ARMv8 系统(如果有帮助的话,一个 Raspberry Pi 3)上编译它。

从上下文中我发现所有 x86 程序集所做的就是报告时钟周期。我翻遍了 ARM 处理器文档,发现我可能应该轮询 CNTPCT_EL0 系统寄存器,并写了以下内容:

但是,我从汇编程序中收到以下错误:

到目前为止,我已经尝试更改 gcc 标志(-mcpu 和 -march 的变体),将目标寄存器显式设置为 64 位,甚至更新 binutils。我错过了什么?

0 投票
0 回答
231 浏览

exception-handling - ARMv8 中调试异常(如软件步骤异常)的路径

在 ARMv8 手册中,它谈到了调试异常的路径。但是,调试异常似乎只能路由到 EL1 或 EL2。有没有办法将调试异常路由到 EL3?

我不熟悉 EL2(ARMv7 中的管理程序模式),我可以在没有真正管理程序的情况下使用 EL2 吗?由于调试异常可以路由到 EL2,我可以只实现一个最简单的 EL2,在处理调试异常时捕获到 EL3 吗?

0 投票
1 回答
193 浏览

arm - 如何在 armv7 汇编程序中加载多个 char 值?

我正在使用 vldm 指令在 armv7 程序中加载多个 char 值,但所有四个值都在加载一个 s 寄存器,但我需要在浮点寄存器(q0)中扩展这些值。

请帮我。这是我的C代码:

0 投票
1 回答
5328 浏览

arm - 通过虚拟地址刷新/无效范围;ARMv8;缓存;

我正在为 32 位模式下运行的 ARMv8 (Cortex-A53) 实现缓存维护功能。当我尝试使用虚拟地址 (VA) 刷新内存区域时出现问题。DCacheFlushByRange看起来像这样

DMA 用于验证功能。DMA 将一个缓冲区复制到另一个缓冲区。源缓冲区在 DMA 之前刷新,目标缓冲区在 DMA 完成后无效。缓冲区是 64 字节对齐的。测试

在转储中,我可以看到它buf1仍然只包含零。当缓存关闭时,结果是正确的,因此 DMA 本身可以正常工作。

另一点是当整个 D 缓存被设置/方式刷新/无效时结果是正确的。

所以很快通过设置/方式刷新/无效工作正常。使用 VA 闪烁/无效也是如此。可能是什么问题?

PS:,kBufSize=4096;总缓冲区大小为4096 * sizeof(uint32_t) == 16KB

0 投票
2 回答
20705 浏览

arrays - ARM 汇编数组

我试图弄清楚数组在 ARM 汇编中是如何工作的,但我只是不知所措。我想将一个大小为 20 的数组初始化为 0、1、2 等等。

我什至不知道如何打印我必须查看的内容是否正确。这是我到目前为止所拥有的:

ARM 让我很困惑,我不知道我做错了什么。如果有人可以帮助我更好地理解这是如何工作的,那将不胜感激。

0 投票
2 回答
9092 浏览

assembly - 如何修复程序集中的“分段错误(核心转储)”?

我正在使用 ARMv8 进行编码。我几乎完成了我的代码,除了我遇到了问题。当我运行代码时,我收到“分段错误(核心转储)”错误。问题的出现是因为当用 //THIS ONE A 注释的行执行时,它将一个非常大的数字存储到 x24 中,而它应该存储一个介于 0-50 之间的数字。因此,在标记为 //THIS ONE B 和 C 的行中,代码尝试指向 x29 + 2^40 左右的位置,而不是 x29 + (0-50)。

我尝试通过代码查找错误数字存储在 i_s 指针中的位置,但我找不到它。我还尝试了将 B 和 C 行中的 x24 更改为 x21 的代码,它运行得非常好。

最让我困惑的部分是,在代码中出现这个问题之前,我在 testOut 标记之后有几乎相同的代码行。唯一的区别是它在哪里工作,我存储到 x21,而它不工作的地方,它存储到 x24。并且 i_s 所指的值从工作负载到破坏负载没有变化。

注意:有问题的行在代码底部附近

0 投票
1 回答
338 浏览

assembly - 如何为堆栈上的变量设置写观察点

在我的代码中,我有

然后在代码中,

它将 0 存储到 x22 中。然后,甚至在代码的后面,我有

即使str两个ldr命令之间没有命令,最终也会将 214748364800 存储到 x23 中。

我的问题是如何为[x29, 16]堆栈上的位置设置一个观察点,以便我可以看到它何时被写入?

我正在使用gdb进行调试。

编辑:这是我在 x29+16 位置设置手表时 gdb 输出的一部分

稍后在 gdb 输出中:

如果我要p$x24在这里输入,它会显示,214748364800即使它加载的[x29,#16]内容是 0

出现错误是因为由于内存分配x24只能是最大值54

0 投票
4 回答
2856 浏览

operating-system - 为什么 ASID 只在 ARMv8-A 的 TLB 中?如何避免未经授权访问表中存在但从 TLB 中弹出的内存?

我有一个关于 ARMv8-A 中的 TLB 和 ASID 的快速问题。
据我了解(来自 ARM 的程序员指南和架构参考手册):
- 页面/块描述符(叶 MMU 表条目)不包含 ASID 标识符,只有一个 nG(非全局)位,表示应该使用 ASID对于这个页面。
- 与寄存器值匹配的实际 ASID 值驻留在 TLB 中。它在发生页面遍历并将相应条目添加到 TLB 时设置(使用当前 ASID,以便后续 TLB 查找将检查新 ASID 是否匹配)。

假设我想使用 ASID 来避免在上下文切换时更新表。每个进程都有一个常驻的 ASID 值。在 vaddr 处理 1 一些数据,在 vaddra1处理 2 a2。我将上下文从 1 切换到 2。在执行期间,对应的 TLB 条目a1被弹出(出于某种原因)。进程 2 访问a1,发生 TLB 未命中和页面遍历,成功并使用 ASID2 值存储进程 1 的条目,使进程 2 可以访问进程 1 的数据

我不明白什么?ASID 机制不应该在进程 1 和 2 之间提供安全性,同时避免更新表吗?

可选问题:如果我的所有程序都有.text相同虚拟地址的部分(至少,所有程序都具有相同的入口点地址),我是否需要在每次上下文切换时更新表,或者我是否可以有多个匹配相同 vaddr 的条目,使用不同的 ASID?

0 投票
5 回答
13863 浏览

assembly - 为什么可以使用 xzr 寄存器而不是 ARMv8 上的文字 0?

我正在阅读 ARM 的SVE 白皮书,遇到了一些让我感到奇怪的事情(在非 SVE 示例中):

我不知道这个xzr寄存器是什么,所以我查了一下,发现ARM 的一些内容表明它在许多情况下是零的同义词。

所以它看起来x8被初始化为零,这是有道理的,因为它是在x8用作循环计数器的循环之前执行的。

我不明白的是,为什么不使用文字0代替xzr?例如:

总而言之,我的问题是:为什么在这里使用xzr寄存器而不是文字0

0 投票
1 回答
4621 浏览

arm - ARMv8 向后兼容 ARMv7(Snapdragon 820 与 Cortex-A15)

我看到 ARMv8 只是 ARMv7 架构的扩展,所有在 ARMv7 上编译的代码都应该在 ARMv8 上运行。我对 ARMv8 到 ARMv7 的向后兼容性感兴趣。在 ARMv8 上编译的代码会在 ARMv7 上运行吗?

我有一个特别感兴趣的案例:我想在Nvidia Jetson TK1(NVIDIA Cortex-A15 CPU)上运行comma.ai 的 Openpilot 视觉二进制文件,该二进制文件是为OnePlus 3 智能手机(Qualcomm MSM8996 Snapdragon 820 CPU)编译的。有远见的人会在 Jetson 上运行吗?

编辑:可能存在比 CPU 兼容性更多的问题,因为 Visiond 可能在该手机上大量使用 GPU。可能取决于他们是使用一些标准的并行化方式(OpenCL、NEON 等)还是有一些针对 Snapdragons GPU 的自定义代码。即使使用 OpenCL,在不同硬件上兼容的机会也可能非常低。