gpt4 book ai didi

portability - 如何在aarch64上检测crc32

转载 作者:行者123 更新时间:2023-12-01 01:43:14 25 4
gpt4 key购买 nike

aarch64 上的用户程序是否可以检测 crc32 指令是否可用?我找到了 references to kernel support对于这种检测,意味着包含有关哪些指令将在用户模式下工作的信息的寄存器在用户模式下不可用(!)。

是这样吗?或者是否有一种可移植的方法来确定 crc32 指令是否可用?

注意:我所说的“用户程序”和“可移植”是一种不需要特权指令或操作系统特定调用或文件(例如/proc/cpuinfo)的方法。代码本身需要能够检测指令是否可用并在可用时使用它们,如果不可用则回退到替代方案。例如,英特尔处理器具有 cpuid为此目的的指令。

更新:

在 ARM 架构描述中翻来覆去,我发现了一个用户级寄存器,PMCR_EL0 ,它为处理器提供了一个 8 位的实现者代码和一个 8 位的 ID 代码。也许如果我能找到这些代码的列表,我可能会更接近我正在寻找的东西。

更新 2:

但是,当我尝试读取该寄存器时,我收到了非法指令异常。那么即使是 EL0 寄存器也需要特权访问?

最佳答案

据我所知,不是。

我在 Chromium 的 zlib 中实现它的方式是使用可用的操作系统功能:
https://cs.chromium.org/chromium/src/third_party/zlib/arm_features.c?l=29

值得一提的是,ARMv8 上的 crc32 指令是加密扩展的一部分,这些扩展在 ARMv8 上是可选的,在 ARMv8-1 上是强制性的。这也意味着运行时特征检测是必要的,有关详细信息,请检查:
https://cs.chromium.org/chromium/src/third_party/zlib/BUILD.gn?l=64

我会避免直接从/proc/cpuinfo 读取,因为这在某些情况下可能不可用(同样取决于 Android 风格,它可能是假阴性)。

在 Chromium 中,zlib 将在特权上下文(即主浏览器进程中的网络代码的一部分)和沙盒上下文(即选项卡中的 RendererProcess 的一部分)中运行。在 RendererProcess 中,从/proc/cpuinfo 读取应该会失败。

大锤方法是安装信号处理程序并使用内联汇编执行指令,如果指令不可用(并且可能被处理程序捕获),这将导致错误。不过不推荐。

上述示例 ( https://github.com/torvalds/linux/blob/master/Documentation/arm64/cpu-feature-registers.txt ) 在我测试过的 1 个 ARM 板 (MachiatoBin) 中工作,但在其他 2 个(rock64 和 nanopi m4)中失败。

Chromium 中实现的方法适用于所有电路板(以及我测试过的一些手机)。

关于 getauxval 的另一个细节:如果在 32 位或 64 位上运行,正确的标志将会改变。因此,在 64 位中,它将是 HWCAP_CRC32,而在 32 位中,它将是 HWCAP2_CRC32。

关于大锤方法:信号容易出现竞争条件,而且您仍将依赖于操作系统特定 API 的使用(即安装信号处理程序)。

最后,根据上下文,如果给定的任务崩溃(即使是按照设计并与执行上下文隔离),它将触发危险信号。

这是一个点(即特征检测),在 x86 上的生活更容易。

话虽如此,依赖操作系统功能可能是一个可以接受的折衷方案。自 M66 版本(当前稳定版本为 M72)以来,我们一直在 Chromium 中提供链接代码,该版本大约一年前首次登陆,没有任何不良报告。

Android 上的一个考虑是,NDK 可能会在内部使用 dlopen()/dlsym() 实现 android_getCpuFeatures(),并且在第一次启动时会增加大约 500us 到 1000us,这就是我们缓存 CPU 功能检测结果的原因。

多线程应用程序(如 Chromium)的另一个考虑因素是需要线程屏障(即 pthread_once_t)以避免在执行 CPU 功能检测时出现竞争条件。

关于portability - 如何在aarch64上检测crc32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53965723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com