[architecture]-Armv8 Cryptographic Extension介绍

本文主要介绍ARMv8的安全扩展,包括ARMv8.0和Armv8.2的安全扩展功能,如Armv8.2增加SHA2、SHA3及支持SM3和SM4。还阐述了aarch64和aarch32指令情况,ARMV8安全扩展使用SIMD指令和浮点寄存器,aarch32无SHA2、SHA3、sm3和sm4指令。

快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈

在这里插入图片描述

说明: 在无特别的说明下,本文讲述得都是armv8-aarch64体系、linux kernel 4.14 arm64软件环境!

在这里插入图片描述

术语:
SIMD Single-Instruction, Multiple-Data

ARMV8的安全扩展使用SIMD指令、floating-point寄存器.

1、ARMv8.0的安全扩展:

• ARMv8.0-AES, which includes AESD and AESE instructions.
• ARMv8.0-SHA, which includes the SHA1* and SHA256* instructions.

2、Armv8.2的安全扩展

AES和SHA可配置enable、disable
ID_AA64ISAR0_EL1.AES
ID_AA64ISAR0_EL1.{SHA2, SHA1}

又增加了两个功能(仅适用于aarch64):

(1)、SHA增加SHA2和SHA3:

• SHA2-512 (SHA512).
• SHA3

(2)、支持 SM3 and SM4

ID_AA64ISAR0_EL1.{SM3, SM4}

3、aarch64指令

ARMV8的安全扩展使用SIMD指令、floating-point寄存器.

(1)、Armv8.0 Cryptographic Extension instructions

在这里插入图片描述

(2)、Armv8.2 SHA2-512 instructions

在这里插入图片描述

(3)、Armv8.2 SHA3 instructions

在这里插入图片描述

(4)、Armv8.2 SM3和SM4

在这里插入图片描述
在这里插入图片描述

4、aarch32指令

而在aarch32上,就没有SHA2和SHA3、sm3和sm4指令了。
在这里插入图片描述


<think>嗯,用户这次提出了一个非常具体的编译错误C1007,关于无法识别"-ARMv8Extension0"标志的问题。从用户引用的站内内容看,ta应该是在进行嵌入式开发(可能是ARM平台),但引用的LED驱动修改和树莓派网卡识别示例与当前问题关联不大——这说明用户可能同时处理多个嵌入式项目,或者误粘贴了无关引用。 用户真正的痛点很明确:在编译过程中遇到了特定于ARM架构的标志识别失败。这个错误代码C1007看起来像是微软编译器的错误码(虽然用户没明确说编译器类型),而"-ARMv8Extension0"这种带减号的标志格式又常见于GCC/Clang,这里存在矛盾点需要验证。 先拆解关键信息: 1)错误提示明确指向编译标志"-ARMv8Extension0"在参数"p2"中无效 2)ARMv8Extension0很可能是某个ARM扩展指令集的配置项 3)用户环境可能是Windows下的ARM交叉编译(因为C1007属于MSVC错误码范围) 接下来需要解决的核心矛盾是:为什么一个看似GCC风格的标志会出现在MSVC编译环境中?可能有两种情况: - 用户错误地混合了不同编译器的标志语法 - 项目构建系统自动生成的标志与当前编译器不兼容 考虑到ARMv8扩展的复杂性,还要确认: - 用户是否在x86机器上交叉编译ARMv8代码 - 使用的编译器具体版本(MSVC对ARMv8支持较新) - 是否涉及NEON/SVE等特定指令集 解决方案应该分层次推进: 先排除最基本的标志语法问题(把GCC的"-"改成MSVC的"/"),再检查工具链兼容性,最后考虑指令集替代方案。特别要注意CMake等构建系统可能自动添加非法标志的情况。 用户可能已经折腾了很久,所以回复要直击重点: 1)明确错误根源是标志格式不兼容 2)给出三套具体修改方案(从简单到复杂) 3)提醒检查工具链版本这个隐藏雷点 最后补充的替代指令集方案很重要——用户可能根本不知道ARMv8Extension0对应哪个具体功能,给出vaddvq_s32这种具体示例能帮ta快速验证。 </think>这个错误通常发生在编译器无法识别特定ARM架构的编译标志时,以下是系统性的解决方案: ### 错误原因分析 1. **无效的标志语法** `-ARMv8Extension0` 可能是拼写错误或不支持的标志格式,ARM编译器通常使用 `-march=armv8-a` 等形式 2. **编译器版本不兼容** 旧版本编译器(如ARMCC 5)可能不支持ARMv8扩展标志 3. **开发环境配置错误** 项目配置可能混用了不同工具链的标志(如CMSIS与LLVM标志冲突) ### 解决方案步骤 #### 方法一:修正标志写法 ```diff - 编译参数: -ARMv8Extension0 + 修正为: -march=armv8-a -mcpu=cortex-a53 // 根据实际芯片指定 ``` > 标准ARMv8标志参考: > - GCC/Clang: `-march=armv8-a` > - ARMCC: `--cpu Cortex-A53` > - MSVC ARM64: `/ARM64`[^1] #### 方法二:更新工具链 1. **检查编译器版本** ```bash armclang --version # ARM Compiler 6 gcc -v # GCC ``` 2. **升级方案**: - ARMv8开发需使用 ARM Compiler 6.12+ 或 GCC 8+ - 安装最新 [ARM Development Studio](https://developer.arm.com/Tools%20and%20Software/Development%20Studio) #### 方法三:检查构建系统 1. 在Makefile/CMake中检查标志传递: ```cmake # CMake示例 if(ARM_TARGET STREQUAL "v8") target_compile_options(app PRIVATE -march=armv8-a) endif() ``` 2. 清理构建缓存: ```bash make clean # Makefile rm -rf build/ # CMake ``` ### 替代方案(如仍不解决) ```c // 手动启用指令集扩展 __attribute__((target("arch=armv8-a"))) void critical_function() { // 使用ARMv8内联汇编 __asm__("add %w0, %w1, %w2" : "=r"(res) : "r"(a), "r"(b)); } ``` ### 验证步骤 1. 创建最小测试文件 `test.c`: ```c int main() { #if defined(__aarch64__) || defined(_M_ARM64) return 0; // ARMv8编译成功 #else return 1; // 失败 #endif } ``` 2. 带参数编译: ```bash armclang -march=armv8-a test.c -o test ``` > **关键提示**:Windows平台需确认是否安装了 ARM64 Build Tools 组件(VS Installer → 单个组件搜索 "ARM64")[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arm精选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值