ARM架构 AArch64 基础知识介绍

news2024/11/23 21:01:38

介绍

  1. aarch64是 ARM 架构的 64 位版本,它是 ARMv8 架构的一部分,被设计用来提供更高的性能和更大的地址空间,同时保持与 32 位 ARM 架构的兼容性。
  2. AArch64 是 ARMv8 的 64 位指令集架构(ISA),它提供了丰富的指令集来支持高性能计算。
  3. Armv8-A支持三种指令集:A32、T32和A64;在AArch64执行状态下执行时使用A64指令集。它是一个固定长度的32位指令集,名称中的64指的是AArch64执行状态对该指令的使用。它不是指内存中指令的大小。A32和T32指令集也分别被称为Arm和Thumb。
  4. 特点
    • 64位寄存器:提供了更多的寄存器,每个寄存器都是 64 位宽。
    • 更大的地址空间:支持超过 4GB 的内存地址空间。
    • 改进的指令集:包括新的指令和对现有指令的扩展,以提高性能和效率。
    • SIMD 扩展:高级 SIMD ( neon) 扩展,提供对单指令多数据(SIMD)操作的支持,增强了图形和多媒体应用的性能。
    • 虚拟化支持:提供了硬件虚拟化功能,使得 AArch64 架构的处理器可以更有效地运行虚拟机。
    • 节能特性:包括多种节能技术,如动态调频和电压调整(DVFS)。
    • 安全性增强:包括安全启动和加密功能,提高了系统的安全性。

寄存器

  1. 寄存器
  • 寄存器是中央处理器(CPU)内部的一小部分高速存储资源,用于快速访问和处理数据。它们在计算机体系结构中起着至关重要的作用。
  • 寄存器(Register)是 CPU 内部的存储单元。可以用来暂存程序指令,数据和内存地址。因为存在于 CPU 内部,所以它的读写速度要比内存快得多。
  • 在寄存器和内存之间,还有一层存储介质叫缓存(Cache)。缓存也在 CPU 内部,访问速度比寄存器慢,比内存快。对于程序而言缓存是透明的,不可操作。
  1. 寄存器与内存关系
  • 寄存器和内存是计算机体系结构中的两种基本存储资源,它们在程序执行和数据处理中扮演着不同但互补的角色。
  • 寄存器是 CPU 内部的一小部分高速存储资源,其访问速度远远快于主存(RAM)。内存则作为计算机的主要存储介质,容量较大但访问速度较慢。
  • 寄存器用于暂存指令、数据和地址,供 CPU 快速处理。内存则用于存储程序的指令代码、大量数据和中间计算结果。
  • 寄存器可以被 CPU 直接访问,而内存则需要通过地址总线间接访问。
  • 寄存器的数据宽度通常是固定的,如 32 位或 64 位,而内存可以存储任意大小的数据。
  • 寄存器和内存之间的数据交换是通过数据总线进行的。CPU 使用 LOAD 和 STORE 指令将数据从内存加载到寄存器,或从寄存器存储到内存。
  • 寄存器作为 CPU 内部的快速存储资源,经常用于暂存从内存中读取的数据或指令,以及待写入内存的数据;所以寄存器和内存之间的关系就是传递这几种类型的数据,以便于
    CPU 进行计算。
    在这里插入图片描述
  1. 寄存器与汇编语言
  • 汇编语言是一种用于电子计算机、微处理器、和其他可编程设备低级编程的编程语言。它是机器语言的文本表示形式,几乎与机器码一一对应,但提供了一些助记符来增强可读性。
  • 汇编语言提供了直接操作 CPU 寄存器的能力。程序员可以通过汇编指令来控制寄存器中的数据,进行加载、存储、算术运算、逻辑运算等操作。
  • 汇编语言中的每条指令通常都直接映射到 CPU 的指令集架构上。这意味着汇编语言中的指令直接体现了 CPU 能够对寄存器执行的操作。
  • 在汇编层面,函数参数和返回值通常通过寄存器传递,以减少内存访问的开销。
  • 不同的 CPU 架构有不同的寄存器集和专用寄存器,汇编语言允许程序员利用这些特性来编写高效的代码。
  1. 通用寄存器
  • 通用寄存器是一组用于存储数据和地址的寄存器,它们在处理程序中扮演着核心角色。
  • 作用
    • 通用寄存器用于存储临时数据、计算结果和变量;
    • 在函数调用时,前几个参数通常通过 X0 到 X7 寄存器传递。返回值通常存储在 X0 寄存器中;
    • 通用寄存器参与算术(如加、减、乘、除)和逻辑(如 AND、OR、NOT、XOR)运算;
    • 寄存器用于提供内存访问指令中的基地址、偏移量或索引;
    • 某些通用寄存器(如 X8 到 X17)可以作为调用者保存的寄存器,在函数调用中保持不变,或用于存储局部变量;
    • 虽然 AArch64 没有单独的状态寄存器,但通用寄存器可以用于存储和传递状态信息,如条件标志;
    • 通用寄存器用于存储系统调用的编号和参数,以及在异常或中断处理中保存上下文;
  • 大多数A64指令都在寄存器上操作。AArch64架构提供了31个通用寄存器。每个寄存器都可以用作64位X寄存器(X0~X30)或32位W寄存器(W0~W30)。这是查看同一寄存器的两种不同方式。例如,下边这个寄存器图显示W0是X0的低32位,W1是X1的低32位。
    在这里插入图片描述
  • 每个通用寄存器都是 64 位宽,这意味着它们可以存储 64 位(8 字节)的整数数据。
  • x0 - x30 是31个通用整形寄存器。每个寄存器可以存取一个64位大小的数。 当使用 x0 - x30 访问时,它就是一个64位的数。当使用 w0 - w30 访问时,访问的是这些寄存器的低32位。
    在这里插入图片描述
  • 对于数据处理指令,X或W的选择决定了操作的size。使用X寄存器将导致64位的计算,使用W寄存器将导致32位的计算。
    • 32位整数加法:ADD W0, W1, W2
    • 64位整数加法:ADD X0, X1, X2
  1. 其他寄存器
  • 零寄存器:XZR和WZR,总是读取为0并忽略写入。XZR是64位的零寄存器,WZR是32位的零寄存器。
  • 栈指针(stack pointer,SP)寄存器:栈指针寄存器是实现程序的运行时栈管理的关键组件,对于维护程序的执行流程和状态管理至关重要。
  • 链接寄存器(Link Register,LR):在计算机体系结构中是一个专用寄存器,主要用于存储函数调用的返回地址;在 AArch64 架构中,LR 通常被命名为 X30,而在其他架构中,它可能是一个单独的寄存器。
  • 程序计数器(PC):是 cpu 内部一个特殊的寄存器,程序计数器是 CPU 执行指令的基础,它确保了指令能够按正确的顺序被取出和执行。
  1. 浮点寄存器
  • AArch64架构引入了SIMD(Single Instruction, Multiple Data)操作,通过矢量寄存器(Vector Registers)来支持高级的浮点运算和数据处理;
  • AArch64提供了32个128位宽的浮点寄存器,编号从V0~V31;
  • 每个浮点寄存器都是128位宽,足以存储两个64位的双精度浮点数或四个32位的单精度浮点数;
  1. NEON 寄存器
  • 128 位宽,与浮点寄存器重叠使用,编号从 Q0 ~ Q31;
  • AArch64 架构的 SIMD 指令集称为 NEON。NEON 寄存器(Q0 到 Q31)实际上是浮点寄存器的另一种视图,用于访问 SIMD 功能。
  • 在 AArch64(ARMv8-A)架构中,浮点寄存器和 NEON 寄存器实际上是同一组寄存器,它们共用相同的物理寄存器集合,但是以不同的方式使用和访问。
  • AArch64 提供了一组共用的 128 位寄存器,用于浮点和 SIMD(单指令多数据)操作。
  • NEON 是 ARM 的 SIMD 指令集,用于处理向量运算。NEON 寄存器用于 SIMD 操作,可以对多个数据元素执行并行操作。
  1. SVE 寄存器
  • 在 AArch64 架构中,Scalable Vector Extension(SVE)引入了新的寄存器类型,这些寄存器与传统的通用寄存器和浮点寄存器不同。
  • SVE引入了可变长度的矢量寄存器,这些寄存器可以从128位扩展到2048位,以适应不同的计算需求;
  • SVE寄存器(Z0-Z31)在低位与AArch64的SIMD&FP寄存器(V0-V31)共享硬件资源,但SVE提供了更高级的SIMD功能和更大的数据处理能力;
  • 在 ARMv9 架构上发布的 SVE2 是 SVE 指令集的超集和扩展,提供了更多的指令和特性。
  1. 系统寄存器
  • 控制 CPU 的各种系统级功能和行为;
  • 系统寄存器不能直接用于数据处理或load/store指令。相反,需要将系统寄存器的内容读入通用寄存器X,对其进行操作,然后将其写回系统寄存器。有两个专门用来访问系统寄存器的指令MRS和MSR。
  • 主要的系统寄存器:
    • 系统控制寄存器:SCTLR_ELx,用于控制系统行为,如缓存、页表遍历等;
    • 内存管理寄存器:TTBR0_ELx / TTBR1_ELx、TCR_ELx、VTTBR_EL2;
    • 异常链接寄存器:ELR_ELx;
    • 保存处理状态寄存器:SPSR_ELx;
    • 中断控制寄存器:DAIF、ICC_*;
    • 性能计数器寄存器:
    • 电源管理控制寄存器:
    • 虚拟化控制寄存器:
    • 安全控制寄存器:SCR_EL3
    • 调试和跟踪控制寄存器
    • 系统寄存器访问控制
    • 浮点控制寄存器:FPCR
  • 系统寄存器命名:系统寄存器通常带有 _ELx 后缀,其中 x 表示异常级别(如 EL1、EL2、EL3)

数据处理指令

  1. 算术运算指令
  • 加法:ADD、ADDS、ADDG
  • 减法:SUB、SUBS、SUBP、SUBG、SUBPS 等
  • 乘法:MUL、MADD、MNEG等
  • 除法:UDIV、SDIV等
  1. 逻辑运算指令
  • 逻辑与:AND
  • 逻辑或:ORR
  • 逻辑异或:EOR
  • 位清除:BIC
  1. 移位运算指令
  • 逻辑左移:LSL
  • 逻辑右移:LSR
  • 算术右移:ASR
  • 循环右移:ROR
  1. 比较指令
  • 比较:CMP
  • 负向比较:CMN
  1. 浮点操作指令:浮点操作遵循与整数数据处理指令相同的格式,并使用浮点寄存器。与整数数据处理指令一样,操作的大小决定了所使用的寄存器的大小。浮点指令的operation总是以 F 开头。
  • 浮点加法:FADD
  • 浮点减法:FSUB
  • 浮点乘法:FMUL
  • 浮点除法:FDIV
  • 浮点平方根:FSQRT

数据加载与存储指令

在 AArch64 架构中,数据加载与存储指令用于在处理器和内存之间移动数据。

  1. 加载寄存器:
  • LDR: 从内存中加载数据到寄存器。它可以用于加载字节、半字、字或双字数据。
  1. 存储寄存器:
  • STR: 将数据从寄存器存储到内存。与 LDR 相对应,它也可以用于存储不同大小的数据。

c++ 中使用汇编方法

  1. 内联汇编
  2. 外部汇编文件
  3. 内联汇编与 c++混用
  4. 使用宏定义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1894054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【高级篇】第10章 Elasticsearch 集群管理与扩展

在本章中,我们将深入探讨Elasticsearch集群的管理与扩展策略,旨在帮助读者构建一个既能应对大规模数据处理需求,又能保持高可用性和弹性的系统架构。我们将从集群架构设计入手,解析不同节点的角色与配置,然后转向节点发现与配置同步机制,最后讨论水平扩展与容错策略,确保…

arthas命令使用

dashboard(线程、内存等环境概览) jvm(JVM相关信息概览) 1、RUNTIME(系统运行环境JVM相关信息,运行时长等) 2、CLASS-LOADING(类加载信息) 3、 COMPILATION(编译信息) 4…

【Linux】探索网络编程:TCP/UDP协议解析与Socket应用实例

文章目录 前言:1. 预备知识1.1 理解源IP地址和目的IP地址1.2 认识端口号1.3 理解"端口号"和"进程ID"1.4 理解源端口号和目的端口号1.5 认识TCP协议1.6 认识UDP协议1.6 TCP vs UDP 可靠性1.7 网络字节序 2. socket 编程接口2.1 socket 常见API2.…

二叉树的链式访问 与 二叉树专题

目录 二叉树的前、中、后序遍历求二叉树第K层节点的个数二叉树查找值为x的节点leetcode相同的树对称二叉树二叉树的前序遍历另一棵子树牛客 二叉树的遍历 二叉树的前、中、后序遍历 1.前序遍历:先访问根节点,再访问左子树,最后访问右子树 根…

花键参数确定的流程是怎么样的?

继续花键的话题,今天跟小伙伴们一同学习一下:渐开线花键的参数确定的一般流程及基本方法。 前面有好几篇介绍了花键的基本参数的概念,包括规格、模数、齿数、压力角等等。以及花键的定心方式,内外花键的配合方式。那么这些参数的…

抬头显示器HUD原理及特性

HUD基本原理 抬头数字显示仪(Head Up Display),又叫平视显示系统,它的作用,就是把时速、导 航等重要的行车信息,投影到驾驶员前风挡玻璃上,让驾驶员尽量做到不低头、不转头 就能看行车信息。 HUD成像为离轴三反的过程&…

零一万物: Yi Model API的使用

一、获取API Key 通过官方网址注册账号并且认证: 零一万物大模型开放平台 创建API Key 二、安装及调用 安装OpenAI SDK ​ 零一万物API 接口兼容 OpenAI 的 Python SDK,只需要简单配置即可使用。 安装 OpenAI SDK。请确保使用的 Python 版本至少为 3.7.1&a…

ESP32CAM物联网教学06

ESP32CAM物联网教学06 拍照上传互联网 在上节课中,小智的物联网视频小车,在与家用的云台监控摄像头的PK中,各具优势,难分高下,这让小智下定决心,再次增强物联网小车的功能,提升小车的智能水平。…

Lumion专业3D渲染三维场景设计软件下载,Lumion强大的三维渲染软件

Lumion,这款软件具备令人瞩目的渲染速度,能够以闪电般的速度生成令人叹为观止的图像、视频和360全景图,让设计师们能够在短时间内将创意转化为视觉盛宴。 Lumion软件内置了一系列可定制的预先配置的HDR天空环境,这些天空环境不仅丰…

Spring启动时,将SpringContext设置到Util中(SpringContextUtil)

场景 在Spring应用开发中,为简化代码或者在静态方法中获取Spring应用的上下文,需要把SpringContext设置到类属性上。经过对源码的分析和实践,使用Spring的事件监听器监听ApplicationPreparedEvent事件是最佳的方式。 通过ApplicationPrepar…

STM32工业自动化控制系统教程

目录 引言环境准备工业自动化控制系统基础代码实现:实现工业自动化控制系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 控制系统实现 4.4 用户界面与数据可视化应用场景:工业自动化与优化问题解决方案与优化收尾与总结 1. 引言 工业自动化控制系统利用…

mac 11 变编译安装nginx

mac 11 变编译安装nginx 记录一次安装过程 所需要的包 pcre: https://sourceforge.net/projects/pcre/files/pcre/OpenSSL: https://www.openssl.org/source/Nginx: https://nginx.org/en/download.html如果没有pcre 和Openssl,报错如下 把pcre和Openssl 解压到nginx 目录下…

通过9大步骤,帮助企业在数字化转型中搭建数据分析的报表体系!

引言:在数字化转型中,企业搭建数据分析的报表体系是一个系统性的过程,需要综合考虑业务需求、数据来源、技术平台等多个方面。此外从报表生命周期的角度来说,从产生、使用以及最后消亡退出体系,都需要通盘考虑&#xf…

新手拍短视频的些许建议

1、尽早行动,拒绝完美主义,有手机就能上车,一开始别花太多时间在打磨细节上。总是要准备好了后再做,就总比别人慢一步,可能永远也追不上了; 2、坚持发,度过难熬的启动期就行,不要走…

6个步骤实现Postman接口压力测试(建议收藏)

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 这里讲是postman做接口并发测试,基础用法不做赘述 1、第一步接口可以通的情况下点击…

Node.js下载及安装详细教程

目录 Node.js安装详细教程 下载安装环境变量配置文件结构配置npm在安装全局模块时的路径和缓存cache的路径测试常见命令 Node.js安装详细教程 👁官网下载地址:Download | Node.js (nodejs.org) 下载速度慢的话 可以使用网盘下载: https://pan.quark.…

flask项目部署总结

这个部署的时候要用虚拟环境,cd进项目文件夹 python3 -m venv myenv source myenv/bin/activate激活 之后就安装一些库包之类的,(flask,requests,bs4,等等) 最重要的是要写.flaskenv文件并且pip install 一个能运行…

新手教学系列——【Ubuntu】SSH配置详解

在使用Ubuntu进行远程管理和开发时,SSH(Secure Shell)是必不可少的工具。SSH不仅提供安全的远程登录功能,还支持安全的文件传输和端口转发。然而,有时我们可能会遇到SSH连接中断的问题。本文将详细介绍如何配置SSH以提高其稳定性,并解释关键配置项。 为什么会出现SSH连接…

去中心化 RAG 先行者,KIP Protocol 如何保护数据所有权、激活 AI 资产

AI 时代,人人都应实现 KnowledgeFi 的梦想或许并不遥远,KIP Protocol 正在生动践行这一价值理念,带动去中心化数字产权的创建与盈利,面向 CryptoAI 的蓝海市场迈出创新探索的技术步伐,朝着 Web3 行业打造去中心化 AI 的…

Matlab/simulink三段式距离/低阻抗保护

距离1段仿真波形如下所示 距离2段仿真波形如下所示 距离3段仿真波形如下所示