- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我已经搜索过,但无法找到有关它是什么以及如何计算的信息。 我不知道为什么这个问题被否决了。不是说清楚和编程有关吗?或者我应该问: # Or you can compute the running CR
如果我有一定数量的字节要串行传输,我如何确定使用哪个 CRC(CRC8、CRC16 等,基本上是多少位的 CRC?)并且错误检测百分比仍然很高?有这个公式吗? 最佳答案 从 CRC 长度的角度来看,适
这个问题在这里已经有了答案: Incremental Checksums (3 个答案) 关闭 8 年前。 如果我有子串 S0, S1, ... Sn 计算出的 CRCs C0, C1, ... C
我知道 CRC 是一个线性函数,这意味着 CRC(x xor y) = CRC(x) xor CRC(y),但我不知道如何证明 CRC 的这个属性。 有谁有想法吗? 非常感谢! 最佳答案 这通常不是真
我知道使用 CRC 的全部目的是进行错误检测,但我听说有人说除了错误检测之外,它还可以用来进行基本的错误纠正。我很好奇是否是这样,如果是这样,它有多强大?我的意思是,我们通常将 CRC 称为能够执行
我见过 8 位、16 位和 32 位 CRC。 在什么时候我需要跳转到更广泛的 CRC? 我的直觉 react 是它基于数据长度: 1-100 字节:8 位 CRC 101 - 1000 字节:16
我正在学习 CRC,搜索引擎和 SO 对此一无所知...... 为什么我们有“正态”、“逆向”和“倒数”多项式?是喜欢 Big Endian、Little Endian 还是其他什么? 最佳答案 CR
在学习计算机网络类(class)时,教授谈到了示例代码中两个有效代码字之间的汉明距离。我已经阅读了有关汉明距离的信息,从告诉 2 个字符串之间的差异距离的角度来看,这是有道理的。例如: Code Wo
我从Wikipedia知道CRC计算算法。关于RAR文件的结构我读过here 。例如有这样写: The file has the magic number of: 0x 52 61 72 21
我已经阅读了 CCITT 和 TI 关于 msp430 的文档。是否可以使用任何内置函数计算 MSP430F5438A 的 CRC?或者我是否必须为每个获取的数据计算 CRC。 最佳答案 可以使用软件
我尝试修改现有项目的 CRC 模块。目前它使用 CRC-16-CCITT。从代码中我知道它的多项式是0x11021,它的CRC-Table是: static const unsigned sh
使用线性反馈移位寄存器(LFSR)实现CRC生成有两种方法,如图所示。图中生成多项式的系数为100111,红色“+”圆圈为异或运算符。两者的初始化寄存器值都是 00000。 例如,如果输入数据比特流是
当数据长度不是4的倍数时,有没有办法通过表驱动的方式加快CRC校验过程?在我的问题中,有 226 位需要检查,并通过 CRC24Q 算法为此计算了 24 位校验和。 最佳答案 使用表格计算第一部分的c
我需要计算消息的 CRC 并将其放在该消息的开头,以便带有“前置”补丁字节的消息的最终 CRC 等于 0。我能够做到这在几篇文章的帮助下非常容易,但不适用于我的特定参数。问题是我必须使用给定的 CRC
我正在将一些从我自己的类中定义的对象保存到文件中。 (保存流数据)。 这一切都很好,但我希望能够在文件中存储该文件的 CRC 校验和。 然后,每当我的应用程序尝试打开文件时,它都可以读取内部存储的 C
我有一组受 16 位校验和保护的数据,需要更正。校验和位置是已知的,计算它们的确切区域以及用于计算它们的确切算法却未知。 16 位,最低有效位在前。我怀疑这是某种 16 位 CRC,但我无法找到实际计
我想使用Nucleo L053R8的crc计算单元计算3字节的CRC值。生成多项式如下:g(X)=x^24 + x^10 + x^9 + x^6 + x^4 + x^3 + x + 1 看来使用这个C
开始之前:我绝对是 JAVA 的初学者。我一直是一名 C++ 程序员。所以当我在这里做傻事时请告诉我! 我正在查询一个巨大的数据库并将该数据直接导出到一个 zip 文件中。我们在这里讨论的是 35GB
我有一些 C++ 代码,我正在将其移植到 C。当我在 C 代码中计算 CRC 时,出于某种原因,它返回错误的 CRC 值,而 C++ 代码运行良好。我是 C++ 的新手。我需要一些帮助来理解我在返回错
我有两个来源来计算看似相同的 crc 值。我不明白为什么“boost/crc.hpp”实现与“linux/lib/crc-ccitt.c”实现不同。 crc-ccitt.c boost 这是一个说明问
我是一名优秀的程序员,十分优秀!