问题标签 [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.
c - 使用内联 ARM 程序集检索时钟周期
我正在玩一些 C 参考代码,它带有自己的基准测试程序。不幸的是,基准测试代码有一行内联 x86 汇编,我正在尝试在 AArch64 ARMv8 系统(如果有帮助的话,一个 Raspberry Pi 3)上编译它。
从上下文中我发现所有 x86 程序集所做的就是报告时钟周期。我翻遍了 ARM 处理器文档,发现我可能应该轮询 CNTPCT_EL0 系统寄存器,并写了以下内容:
但是,我从汇编程序中收到以下错误:
到目前为止,我已经尝试更改 gcc 标志(-mcpu 和 -march 的变体),将目标寄存器显式设置为 64 位,甚至更新 binutils。我错过了什么?
exception-handling - ARMv8 中调试异常(如软件步骤异常)的路径
在 ARMv8 手册中,它谈到了调试异常的路径。但是,调试异常似乎只能路由到 EL1 或 EL2。有没有办法将调试异常路由到 EL3?
我不熟悉 EL2(ARMv7 中的管理程序模式),我可以在没有真正管理程序的情况下使用 EL2 吗?由于调试异常可以路由到 EL2,我可以只实现一个最简单的 EL2,在处理调试异常时捕获到 EL3 吗?
arm - 如何在 armv7 汇编程序中加载多个 char 值?
我正在使用 vldm 指令在 armv7 程序中加载多个 char 值,但所有四个值都在加载一个 s 寄存器,但我需要在浮点寄存器(q0)中扩展这些值。
请帮我。这是我的C代码:
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
arrays - ARM 汇编数组
我试图弄清楚数组在 ARM 汇编中是如何工作的,但我只是不知所措。我想将一个大小为 20 的数组初始化为 0、1、2 等等。
我什至不知道如何打印我必须查看的内容是否正确。这是我到目前为止所拥有的:
ARM 让我很困惑,我不知道我做错了什么。如果有人可以帮助我更好地理解这是如何工作的,那将不胜感激。
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 所指的值从工作负载到破坏负载没有变化。
注意:有问题的行在代码底部附近
assembly - 如何为堆栈上的变量设置写观察点
在我的代码中,我有
然后在代码中,
它将 0 存储到 x22 中。然后,甚至在代码的后面,我有
即使str
两个ldr
命令之间没有命令,最终也会将 214748364800 存储到 x23 中。
我的问题是如何为[x29, 16]
堆栈上的位置设置一个观察点,以便我可以看到它何时被写入?
我正在使用gdb进行调试。
编辑:这是我在 x29+16 位置设置手表时 gdb 输出的一部分
稍后在 gdb 输出中:
如果我要p$x24
在这里输入,它会显示,214748364800
即使它加载的[x29,#16]
内容是 0
出现错误是因为由于内存分配x24
只能是最大值54
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?
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,在不同硬件上兼容的机会也可能非常低。