一文彻底分清ARM架构、内核、指令集等相关概念

2023-05-16

任何学习嵌入式/单片机的朋友都绕不开ARM,但初学者总是对ARM架构、内核、指令集等相关概念不够清晰或者混淆,本文帮助入门的朋友彻底弄清楚。

目录

1.芯片、CPU、SOC

2.ARM公司

3.ARM架构与内核、指令集

3.1架构与内核

3.2架构与指令集

4.ARM架构和处理器发展史

4.1ARM架构

4.2ARM处理器


 原文地址:一文彻底分清ARM架构、内核、指令集等相关概念 

1.芯片、CPU、SOC

在谈论ARM之前,必须把芯片、CPU、SOC这些概念解释清楚,芯片是一个广泛的词语,属于半导体元件的总称。英语会更准确:integrated circuit(集成电路)。很多人把芯片等同于CPU,这显然是错误的。CPU只是属于芯片这个概念范围内的一种。

而我们日常所谈论的手机处理器往往指的是SOC。SOC全称System on Chip,即片上系统,也就是集成了很多东西在一个芯片上,简单地说SOC包含了CPU加上很多其他模块。

复杂地说SOC包含了微处理器(MPU Micro Processor Unit)、数字IP核、模拟IP核和存储器。微处理器,也即是逻辑核,包括CPU、时钟、中断控制器、I/O端口以及用于各种IP核之间的粘合逻辑等等,负责系统的控制。数字IP核包含了我们的加速器,能够减轻处理器的计算负担。模拟IP核包含了ADC、DAC、PLL等模拟电路,负责与外界的模拟信息进行数据传输。存储器包括各种易失、非易失以及Cache等存储器,用于储存系统运行的代码以及数据。

这里要指出一个概念上的CPU问题,CPU其实是一个相对概念(注意理解Unit单元),当我们指手机的CPU,就是指这个手机的中央处理单元,也就是SOC,比如高通骁龙888,当我们指SOC的CPU则是指SOC中的中央处理器单元,也就是微处理器(MPU),当我们指MPU的CPU时,则是指MPU的中央处理单元。你要是看多了英文资料,你就会发现老外很少用CPU这个词,而基本上都用Processor处理器,有处理功能的都可以叫处理器。

附:MCU(MicroController Unit)和SOC并没有特别本质的区别,SOC比MCU集成了更多东西,更强大而已。而单片机这个概念更是广泛,MCU和SOC都可以称为单片机,不详细论述了。如51、STM32F1、STM32F4等都可以叫MCU,而STM32MP、S3C2440、IMX6ULL、高通骁龙、海思麒麟等都可以叫SOC,他们也都可以被叫做单片机,当然一般来说单片机指的是MCU。

2.ARM公司

首先ARM是家公司,在1990年成立,全名是“Advanced RISC Machines Ltd.,”——先进精简指令集机器公司.ARM公司是一家知识产权(IP)供应商,它不制造处理器,而是设计,售卖设计器方案(不止设计处理器,但主要是处理器)。

ARM公司的历史就不赘述了,感兴趣的直接去他官网就能知道。https://www.arm.com/

也就是说ARM公司设计出一种处理器设计方案,然后其他有制造SOC、MCU需求的公司,比如三星、ST、TI、IMX、华为等,去购买ARM公司的方案,在他的基础上删删改改,加些外围东西变成自己想要的SOC、或MCU设计,再去找制造公司生产。

3.ARM架构与内核、指令集

3.1架构与内核

首先要理解架构是什么东西。架构指的是一种大体上的方案,比如造房子,高楼、平房、独栋别墅,这就是三种不同的架构。

你想造一个房子,在具体的细节实现之前,你必须思考,我到底要造高楼、平房、独栋别墅.........然后我确定我要造平房,什么样的平房?我要造三室一厅的平房,这就是一种基于平房架构的内核,我要造四室一厅的平房,这就是基于平房架构的另外一种内核。

先有架构,再有内核,一个架构可以衍生出多种内核

内核之所以称之为内核,是因为他是在SOC、MCU内部中最核心的逻辑处理部分,就是SOC、MCU的CPU。所以内核也可以叫做处理器。

别的公司可以向ARM公司购买架构使用权,ARM给你架构,你自己去设计内核,这就是自研内核,比如三星、高通、苹果公司都有基于ARM架构的自研内核。ARM公司自己针对自己架构设计的内核又称作公版内核,别的公司也可以购买ARM的公版内核使用权,比如华为用的就是公版内核。

现以IMX6ULL芯片为例,IMX6ULL芯片,又可以叫IMX6ULL SOC。其内部组成如下:

用红框标出来的部分叫做内核,为ARM Cortex-A7,而这个内核时基于ARMv7-A 架构。

以STM32F407芯片为例,STM32F407芯片又可以叫做STM32F407 MCU(太大,只展示一部分):

内核为ARM Cortex-M4,而这个内核基于ARMv7E-M架构。

3.2架构与指令集

ARM架构ARM指令集经常放在一起说。经常说成ARM指令集架构,实际上并不完全相等。

ARM架构包含了指令集、寄存器集、存异常模型、内存模型等内容。

指令集是指处理器能够识别并执行的指令集合。

ARM,Advanced RISC Machines,先进精简指令集机器,其中RISC是Reduced Instruction Set Computer的缩写,意为精简指令集处理器,ARM是RISC最突出的代表,其它比较有名的RISC指令集还有:MIPS,PowerPC,SPARC,RISC-V。

与RISC相对的是CISC,Complex Instruction Set Computer,复杂指令集处理器,闻名世界的X86指令集就是一种CISC指令集。

ARM指令集也是一个统称,实际上ARM指令集还分为 ARM64指令集、 ARM32指令集、THUMB指令集、THUMB-2指令集、NEON指令集、VFP指令集、DSP指令集。不同版本架构支持不同指令集。

4.ARM架构和处理器发展史

4.1ARM架构

ARMv1:1985年发布,最早的ARM架构。

ARMv2:1986年发布,改进了ARMv1,增加了32位地址总线和指令集扩展(增加了一些指令)。

ARMv3:1992年发布,支持虚拟内存、增加了指令集扩展,包括支持协处理器(coprocessor)。

ARMv4:1994年发布,增加了Java虚拟机指令集扩展(Jazelle)和Thumb指令集,提高了代码密度。

ARMv5:1997年发布,增加了支持嵌入式Java的指令集扩展(Jazelle-RCT)、增加了支持浮点运算的指令集扩展(VFP)。

ARMv6:2002年发布,增加了Thumb-2指令集,提高了代码密度和执行效率,同时也增加了一些指令集扩展,包括支持Jazelle-DBX。

ARMv7:2004年发布,增加了基于TrustZone的安全扩展、NEON指令集扩展,支持向量浮点运算(VFPv3)等。

ARMv8:2011年发布,增加了AArch64架构,支持64位处理器,同时保留了AArch32架构,提高了性能和能耗效率。

ARMv9:2021年发布,增加了Confidential Compute Architecture(CCA)和Realms技术,提高了安全性和隔离性。

4.2ARM处理器

针对每一种ARM架构,ARM都设计了很多的处理器(内核),这里就不列出来了,感兴趣去官网能够查找。这里主要讲讲命名的变化。

主要分为经典处理器、Cortex-M系列处理器、Cortex-R系列处理器、Cortex-A系列处理器

经典处理器都是按照数字命名的,直到ARM11。也就是推出架构v7的时候,ARM公司把产品并分为三大产品线,分别是Cortex-A、Cortex-R和Cortex-M。

近两年推出的cortex-X并不是单独的产品线,它可看做cortex-A的升级版,两者的市场定位是一样的。

Cortex-A系列处理器是针对高端应用而设计的,通常应用于智能手机、平板电脑、数字电视和网络设备等。这些处理器拥有高性能、大规模的内存管理单元以及大量的内部缓存,支持多核处理和虚拟化技术。

Cortex-R系列处理器是针对实时应用而设计的,通常应用于汽车、工业控制和医疗设备等。这些处理器拥有极低的延迟、高精度的计时器和内部存储器保护机制,能够在实时响应和高可靠性方面表现出色。

Cortex-M系列处理器是针对低功耗、低成本、嵌入式应用而设计的,通常应用于传感器、智能家居、工业控制和医疗设备等。这些处理器拥有低功耗、小尺寸和低成本等优点,同时也支持实时性、安全性和可靠性等特性。

原文地址:一文彻底分清ARM架构、内核、指令集等相关概念

系列文章合集:

FreeRTOS文章合集

嵌入式Linux基础文章合集

ARM学习系列合集

C语言学习系列合集

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文彻底分清ARM架构、内核、指令集等相关概念 的相关文章

  • 从 Visual Studio 交叉编译 ARM7 代码

    是否可以从 Visual Studio 2008 2010 Express 或 Professional 编译 ARM7 如果是这样 可以指导我如何做吗 我读过有关 Yagarto 工具链的其他帖子 这一切是如何融入图片中的 我在这个领域非
  • 对 -finstrument-functions 的未定义引用

    我正在尝试跟踪内核函数并且我正在使用 finstrument functions这样做 但我收到未定义的参考错误 如下所示 arch arm kernel elf c 9 undefined reference to cyg profile
  • Pandaboard 交叉编译 Qt

    我花了几周的时间尝试为我的 Panda 板交叉编译 Qt 但没办法 我无法通过 configure 如果有人能给我帮助 我将不胜感激 我的主机系统是Ubuntu 13 04 86 64位 在Virtualbox中运行 我的目标系统是 Pan
  • armv8 NEON if 条件

    我想了解armv8 NEON内联汇编代码中的if条件 在armv7中 这可以通过检查溢出位来实现 如下所示 VMRS r4 FPSCR BIC r4 r4 1 lt lt 27 VMSR FPSCR r4 vtst 16 d30 d30 d
  • 我们可以优化代码来降低功耗吗?

    有没有什么技术可以优化代码以确保更低的功耗 架构是ARM 语言是C 来自 ARM 技术参考网站 ARM11 MPCore 的特性 提高能源效率的处理器 效率包括 准确的分支和子程序返回预测 减少数量 错误的指令获取和 解码操作 使用物理寻址
  • Android 上原生的自修改代码

    我正在尝试在 Android 上制作一些自修改本机代码并在模拟器中运行它 我的示例基于 android ndk 中的 Hello JNI 示例 它看起来像这样 define NOPE LENGTH 4 typedef void FUNC v
  • arm64 汇编:LDP 与 LD4 执行时间

    假设我想用连续内存位置的值加载四个连续的 aarch64 向量寄存器 一种方法是 ldp q0 q1 x0 ldp q2 q3 x0 32 根据ARM优化指南 https static docs arm com uan0016 a cort
  • 如何修改内核DTB文件

    Summary 我目前正在为定制板编译 Linux 内核 内核 模块和 DTB 以及一些定制驱动程序 有时 我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容 现在 我可以解决此问题的唯一方法是修改 DTS
  • 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

    我正在使用codesourcery g lite 基于gcc4 7 2版本 为stm32 Cortex m3 编程 我希望动态加载可执行文件 我知道我有两个选择 1 可重定位的elf 需要一个elf解析器 2 具有全局偏移寄存器的位置无关代
  • ARM 汇编分支到寄存器或内存内部的地址

    我想知道在 ARM 汇编中我可以使用哪条指令分支到存储在某个内存地址中的地址或标签 例如 我们可以使用B LABEL来跳转到LABEL 但现在目的地只能在运行时知道 并且它存储在某个已知的内存位置 是否有类似 B 地址 的东西 Thanks
  • 手臂“版本”之间的差异? (仅限 ARMv7)

    基本上我想知道ARMv7l和ARMv7之间的区别hl 我有一个带有armv7l的arm处理器 并且有很多armv7的rpmhl 我完全不知道我必须搜索什么才能获得相关信息 这个 后缀 叫什么 还有其他类型吗 他们的做法有何不同 我假设它指示
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • Linux malloc() 在 ARM 和 x86 上的行为是否不同?

    这个网站上有很多关于内存分配的问题 但是我 找不到专门解决我的问题的人 这 问题 https stackoverflow com questions 19148296 linux memory overcommit details似乎最接近
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • Beaglebone Black 的 U-boot 无法构建 - 目标 CPU 不支持 THUMB 指令

    我正在尝试按照 Chris Simmonds 的 掌握嵌入式 Linux 编程 中的说明为 Beagle Bone Black 构建 u boot 我已经构建了交叉工具链 现在正在尝试使用该工具链构建 Das U boot 但由于不支持 T
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能

随机推荐

  • 使用FSMC驱动LCD以及数据线偏移的问题

    FSMC的理解 使用FSMC功能将8080接口的LCD当外部RAM来使用 xff08 数据传给LCD时没经过内部SRAM xff0c 所以一帧图片很大也可以直接传 xff09 xff0c 根据STM的地址分配图可以看出外部RAM的地址由0x
  • C++调用HTTP实现方式

    转自 xff1a http blog 163 com lyz sea blog static 11558670720118245052189 Http访问有两种方式 xff0c GET和POST xff0c 就编程来说GET方式相对简单点
  • 跟我学c++中级篇——STL智能指针再述

    一 智能指针 xff08 smart pointer xff09 在前面的文章分析中对智能指针分析的还是比较多的 xff0c 这里把一具体的遗漏以及一些新的感悟再总结一下 xff0c 以之为鉴 什么是智能指针 xff1f 在C C 43 4
  • 从CAN到CANOpen——准入门大全(二)

    第二节 关于CAN ID xff1a 一个标准帧的ID共11位 xff0c 一个扩展帧的ID共29位 扩展帧的ID分11位和18位的两段 xff0c 如下图所示 RTR显性 xff1a 数据帧 xff1b 隐性 xff1a 远程帧 SRR隐
  • vscode使用clang-format格式化C++代码

    1 安装c c 43 43 插件 2 在首选项 设置中搜索format xff0c 设置Editor Default Formatter为ms vscode cpptools 3 在扩展C C 43 43 中设置 Clang format
  • EC20 GPS RMC格式数据转化

    文章目录 目录 前言 一 RMC是什么 xff1f 二 EC20 输出的RMC解析 1 EC20返回的RMC报文 2 RMC报文解析 3 NMEA数据ddmm mmmm转换成dd ddddd 4 RMC UTC时间转化成北京时间 总结 前言
  • C++ 第三方常用网络库

    From xff1a https www cnblogs com aitantianderuangutou p 11416902 html 1 ACE 庞大 复杂 xff0c 适合大型项目 开源 免费 xff0c 不依赖第三方库 xff0c
  • Postman 使用方法详解

    From xff1a https zhuanlan zhihu com p 534078123 Postman V9 16 绿色版汉化 xff1a https www cr173 com soft 1497202 html Postman是
  • 串口波形分析

    本文使用逻辑分析仪 xff0c 抓取串口波形 xff0c 进而分析串口数据 串口配置为115200波特率 xff0c 8个数据位 xff0c 1个停止位 xff0c 无校验方式 字符1的波形如下图 xff1a 从图中可以看到8个数据位 xf
  • 电影资源 BT PT下载的电影命名 规则 资源 详解

    初识 一般来说 xff0c 正规压制组压制的电影 xff0c 都采用 0day 命名方式 xff0c 即 xff1a 英文名称 版本说明 年份 片源 分辨率 视频编码 音频格式 压制小组 例如文件名 xff1a Jumanji The Ne
  • 对于51单片机的RAM内存分配(包含栈的分配)

    对于51单片机的RAM内存分配 xff08 包含栈的分配 xff09 我使用的是SH79F3283 xff0c 内部RAM有256字节 xff0c 由常规寄存器 静态存储区和堆栈组成的 xff0c 创建一个新的程序默认占用9个字节RAM x
  • 忘记windows密码解决办法(用户密码或SYSKEY)

    64 TOC 还有朋友问第一层的BIOS密码怎么解 xff1a 拔电池就能解 xff0c 断电 xff0c 打开电脑主板 xff0c 找到一个纽扣电池 xff0c 拔掉 xff0c 长按电源键 xff0c 再插电 xff0c 第一层就没了
  • 【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

    超详细讲解哈夫曼树 Huffman Tree 以及哈夫曼编码的构造原理 方法 xff0c 并用代码实现 1哈夫曼树基本概念 路径 从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 结点的路径长度 两结点间路径上的分支数 树的路径长
  • Makefile命令参数、调用其他Makefile、嵌套

    更多单片机 嵌入式内容及参考资料 xff1a 大叔的嵌入式小站 xff1a Makefile学习 3 make命令参数 调用其他makefile 嵌套 一 Make命令运行参数 参数 参数的作用 C dir读入指定目录下的makefile
  • ARM学习-ARM指令集详解

    目录 1 ARM 存储器访问指令 1 1 LDR 和STR 加载 存储字和无符号字节指令 1 2 LDM和STM 批量加载 存储指令 1 3 SWP 寄存器和存储器交换指令 2 ARM 数据处理指令 2 1数据传送指令 2 1 1 MOV
  • IIC(I2C)协议详解

    1 简介 IIC 即I C xff0c 全称 Inter Integrated Circuit xff0c 字面上的意思是集成电路之间 xff0c 它其实是I C Bus简称 xff0c 所以中文应该叫 集成电路总线 xff0c 它是一种串
  • STM32F4+FreeRTOS+LVGL实现嵌入式快速开发(缝合怪)

    极速进行项目开发 xff0c 只需要懂一款芯片架构 43 一个操作系统 43 一个GUI 各种部件程序全靠抄 xff0c 成为究极缝合怪 本文用stm32f407 43 FreeRTOS 43 lvgl演示一些demo 原文链接 xff1a
  • 彻底弄清FreeRTOS中的事件组(Event Groups)

    之前已经学过两个任务之间可以利用信号量 队列来通信 xff0c 任务可以利用这两个机制等待某一个事件发生 xff0c 但是假如需要等待多个事件发生呢 xff1f 这就需要用到事件组了 事件组可以让任务进入阻塞态 xff0c 等待一个或多个事
  • 彻底掌握FreeRTOS中的务通知(Task Notifications)

    在之前的文章中已经讲解了很多种用于任务件通信的机制 xff0c 包括队列 事件组和各种不同类型的信号量 使用这些机制都需要创建一个通信对象 事件和数据不会直接发送到接收任务或接收ISR xff0c 而是发送到通信对象 xff08 也就是发送
  • 一文彻底分清ARM架构、内核、指令集等相关概念

    任何学习嵌入式 单片机的朋友都绕不开ARM xff0c 但初学者总是对ARM架构 内核 指令集等相关概念不够清晰或者混淆 xff0c 本文帮助入门的朋友彻底弄清楚 目录 1 芯片 CPU SOC 2 ARM公司 3 ARM架构与内核 指令集