我试图确定何时在运行时iOS上可用的可选ARMv8 cpu功能.在OS X桌面上,我们可以使用i686,x86_64,PPC和PPC64 sysctl.例如,请参阅Mac OS X上的PR 3108,无SIGILL处理器功能检测.
在"自由SIGILL处理器能力"部分是重要的,因为SIGILL基于特征探讨在苹果的平台来破坏内存.我遵循的至少三个项目都遇到了问题,包括Crypto ++和OpenSSL.问题的另一部分是像Apple Clang在Xcode 10下缺少ARMv8/Aarch64的CRC32这样的问题吗?,应该存在的核心ARMv8功能似乎缺失或不受支持.
我已经找到了相当于OS X台式机的iOS,但我找不到它们(见下文).
我们真的更喜欢避免像CommonCrypto这样的Apple框架.我们努力保持平台不可知.我们不使用CommonCrypto,但如果没有任何不可知的东西(我正在制作它),我会考虑使用下面的Apple函数:
BOOL CCHasAes();
BOOL CCHasSHA1();
BOOL CCHasSHA2();
Run Code Online (Sandbox Code Playgroud)
Apple是否发布了一种在运行时确定cpu功能的方法?
我们如何在iOS上确定运行时的cpu功能?
这些可能是相关的,但我不确定这是否是我们拥有的最好的,或者这是我们唯一拥有的,或者是否还有其他方法可以解决它.
下面我正在寻找CRC-32,CRC-32C,AES,PMULL,SHA1和SHA2功能.我没有看到任何类似于我正在寻找的点击.Apple自Xcode 7起支持ARMv8,因此8.2支持CPU.
$ grep -IR CTL_ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk | \
sed 's|/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk/usr/include|...|g'
.../c++/4.2.1/bits/c++config.h:#define _GLIBCXX_HAVE_SYS_IOCTL_H 1
.../netinet/in.h:#define IPCTL_FORWARDING 1 /* act as router */
.../netinet/in.h:#define IPCTL_SENDREDIRECTS 2 /* may send redirects when forwarding */
.../netinet/in.h:#define IPCTL_DEFTTL 3 /* default TTL */
.../netinet/in.h:#define IPCTL_DEFMTU …Run Code Online (Sandbox Code Playgroud) 我上过几门涉及 ARMv8 汇编的课程,但是两位老师都以不同的方式描述了 LDUR/STUR 指令,现在我已经迷失了方向。有人可以帮忙澄清一下吗?
如果我有指令:
LDUR R3, [R1, #8]
Run Code Online (Sandbox Code Playgroud)
我将把答案放在 R3 中,但是我从 R1 中得到了什么以及偏移量如何运作?这就像一个逻辑转变吗?ARM 手册将其描述为“字节偏移量”,但并未描述该偏移量如何在 R1 上运行。我是否移动了存储在 R1 中的值(比如 R1 的值是 50),还是我需要考虑 R1 之外的内存地址?其他消息来源说我需要以某种方式将 R1 视为一个数组?
我正在阅读ARM发布的SVE白皮书,并发现了令我印象深刻的东西(在非SVE示例中):
mov x8, xzr
Run Code Online (Sandbox Code Playgroud)
我不知道这个xzr寄存器是什么,所以我查了一下,发现ARM的一些内容,说它在很多情况下都是零的同义词.
所以看起来x8它被初始化为零,这是有道理的,因为它在循环之前执行,x8用作循环计数器.
我不明白的是,为什么不使用文字0而不是xzr?例如:
mov x8, 0
Run Code Online (Sandbox Code Playgroud)
总而言之,我的问题是:为什么可以使用xzr寄存器而不是文字0?
我对ARM处理器的内部细节不是很熟悉,但是我不了解Nvidia Jetson Nano开发板上的以下行为。
C代码示例...
//main.c
#include <stdio.h>
int main()
{
int fred = 123;
int i;
for(i = -10 ; i <= 10 ; i++)
printf("%d / %d == %d\n", fred, i, fred / i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译:
gcc main.c -ggdb
Run Code Online (Sandbox Code Playgroud)
运行生成的a.out可执行文件将产生以下输出...
123 / -10 == -12
123 / -9 == -13
123 / -8 == -15
123 / -7 == -17
123 / -6 == -20
123 / -5 == -24
123 / -4 == -30
123 / …Run Code Online (Sandbox Code Playgroud) 这个问题涉及ARM汇编语言。
我的问题是是否可以使用宏来替换 ASM 代码中的立即值来移位寄存器值,这样我就不必对数字进行硬编码。
我不确定上面的问题是否有意义,所以我将提供一个带有一些asm代码的示例:
因此,存在很少的指令,例如(https://developer.arm.com/documentation/dui0473/m/arm-and-thumb-instructions/rorror )中的指令,其中可以使用寄存器值来旋转值如我们所愿:ARM
#define rotate(number, ptr) ({ \
asm volatile( \
"ror %[output], %[output], %1\n" \
: [output]"+r"(ptr) \ // this is the in/output
: "r"(number)); \ // this is the rotator
})
Run Code Online (Sandbox Code Playgroud)
现在,让我们看一下( https://developer.arm.com/documentation/dui0473/m/arm-and-thumb-instructions/orrorr )中的指令。ARM
语法如下:ORR{S}{cond} Rd, Rn, Operand2
其中Operand2是一个灵活的操作数,这意味着它可以是constantor a register with optional shift(来源:https ://www.keil.com/support/man/docs/armasm/armasm_dom1361289851539.htm )
所以这样的事情会起作用:
#define orr_test(ptr) ({ \
uint64_t __result; \
asm volatile (\
"orr …Run Code Online (Sandbox Code Playgroud) 有谁知道在哪里可以找到 ArmV8 中 Linux 系统调用的约定?必须传入什么寄存器参数以及返回值存储在哪里。
ARMv8.3 引入了新指令:LDAPR。
当 STLR 后跟 LDAR 到不同的地址时,这两个不能重新排序,因此称为 RCsc(释放一致顺序一致)。
当 STLR 后跟 LDAPR 到不同的地址时,这 2 个地址可以重新排序。这称为RCpc(发布一致处理器一致)。
我的问题是PC部分。
PC 是 TSO 的松弛,其中 TSO 是多副本原子,而 PC 是非多副本原子。
ARMv8的内存模型已改进为多副本原子,因为没有供应商创建过非多副本原子微体系结构,这使得内存模型更加复杂。
所以我遇到了矛盾。
关键问题是:每个存储(包括宽松的存储)都是多副本原子的吗?
如果是这样,那么 rcpc 的 PC 部分对我来说没有意义,因为 PC 是非多副本原子的。由于 ARM 过去是非多副本原子的,它是否可能是一个遗留名称?
PC有多种定义;所以也许这就是原因。
我看到 ARMv8 只是 ARMv7 架构的扩展,所有在 ARMv7 上编译的代码都应该在 ARMv8 上运行。我对 ARMv8 到 ARMv7 的向后兼容性感兴趣。在 ARMv8 上编译的代码能否在 ARMv7 上运行?
我有一个特别感兴趣的案例:我想在Nvidia Jetson TK1(NVIDIA Cortex-A15 CPU)上运行为OnePlus 3 智能手机(Qualcomm MSM8996 Snapdragon 820 CPU)编译的comma.ai 的 Openpilot 视觉二进制文件。有远见的人会在 Jetson 上运行吗?
编辑:可能有比 CPU 兼容性更多的问题,因为 Visiond 可能在该手机上大量使用 GPU。可能取决于他们是否使用一些标准的并行化方式(OpenCL、NEON 等)或者是否有一些用于 Snapdragons GPU 的自定义代码。即使使用 OpenCL,在不同硬件上兼容的可能性也可能很低。
arm cpu-architecture backwards-compatibility binary-compatibility armv8
根据ARM 文档,线程 ID 寄存器类似于TPIDR_EL0或TPIDR_EL1,
提供存储软件线程和进程 ID 的位置,以用于操作系统管理目的。这些寄存器对处理器行为没有影响。
为什么有人想要将线程 ID 存储在特殊寄存器中?ARM 处理器是否要求线程在内存中拥有特殊的结构,就像 MMU 一样?线程对于 ARM 来说是特殊的东西吗?ARM 期望在某个地方找到它吗?或者我可以在不使用这个寄存器的情况下(有效地)实现线程吗?
我这么问是因为我在 Fuchsia OS 的 Zircon 内核上找到了这段代码:
static inline void arch_set_current_thread(Thread* t) {
__arm_wsr64("tpidr_el1", (uint64_t)&t->arch_.thread_pointer_location);
__isb(ARM_MB_SY);
}
Run Code Online (Sandbox Code Playgroud)
在启动时,它创建一个线程并将其指针存储在tpidr_el1