1.ARM处理器概论

一.ARM概述

ARM(Advanced RISC Machines)有三种含义

  •  一个公司的名称

  •  一类处理器的通称

  •  一种技术

ARM产品系列:

指令集: 分为两种,RISC是简单指令集处理器,CISC是复杂指令集处理器

SOC(System on Chip): 即片上系统,将一个系统中所需要的全部部件集成在一个芯片中在体积、功耗、价格上有很大优势

  • 不是存粹的CPU,其还集成了很多器件

二.ARM指令集概述

1.指令集

指令:

  • 能够指示处理器执行某种运算的命令(如加、减、乘...)

  • 在内存中以机器码(二进制)的方式存在

  • 每一条指令对应一条汇编

  • 程序是指令的集合

指令集: 由厂商提供,只管用即可

  • 处理器能识别的指令的集合称为指令集

  • 不同架构的处理器指令集不同

  • 指令集是处理器对开发者提供的接口

2.ARM指令集

简述: 大多数ARM处理器都支持两种指令集

  • ARM指令集: 用的比较多

    • 所有指令(机器码)都占用32bit(4字节)存储空间

    • 执行ARM指令集时PC值每次自增4

    • 特点: 代码灵活度高,简化了解码复杂度

  • Thumb指令集

    • 所有指令(机器码)都占用16bit(2字节)存储空间

    • 执行Thumb指令集时PC值每次自增2

    • 特点: 代码密度高,节省存储空间

3.编译原理

(1)机器码

定义: 机器码是CPU能够直接识别的⼀种语⾔,由⼆进制组成

特点:

  • 不同处理器有不同的机器码,代表不同的指令

  • 机器码由CPU的硬件设计决定

  • 机器码不可移植,因为不同处理器的机器码不同

(2)汇编语言

定义: 汇编语⾔是机器码的符号化,⽤⼀个单词或符号来代替⼀个机器码

特点:

  • 汇编语⾔和机器码⼀⼀对应

  • 汇编语⾔解决了机器码难读、难写、难维护的问题

  • 汇编语⾔仍然不可移植,因为不同处理器的汇编语⾔也不同

(3)高级语言

简述: 以C语言为例,其有以下特点

  • 不区分处理器架构

  • 依赖于编译器进而拥有可移植性

    编译器可以将C语⾔编译成不同处理器的汇编语⾔,再进⼀步变成机器码

编译过程:

  • 预处理: 删除注释,展开宏,展开头⽂件。

  • 编译: 将C语⾔变成汇编语⾔。

  • 汇编: 将汇编语⾔变成机器码。

  • 链接: 将机器码和库中的机器码合成⼀个完整的可执⾏程序。

4.ARM存储模型

(1)ARM数据类型

基本数据类型

ARM处理器的数据类型:

  • 字节(Byte): 在内存中占8位,即一个字节

  • 半字(Half Word): 在内存中占16位,即两个字节

  • 字(Word): 在内存中占32位,即四个字节

高级语言与ARM的数据类型: ARM实际支持的数据类型只有上面的三种,至于高级语言中的各种数据类型,则是通过编译器根据代码中的数据类型将其编译成相应的与上面对应的机器码

浮点型数据处理: ARM本身不能直接处理浮点型数据,其通过下面两种形式间接实现

  • 通过软件模拟实现浮点型运算

  • 在ARM外围加⼀个协处理器,⽤于处理浮点型数据

数据存储

简述: ARM中进行数据存储时,数据本⾝是多少位的,在内存中就应该多少位对⻬

Word型数据的存储规则:

  • 位数: 占四个字节

  • 存储规则: Word型数据在内存中的起始地址必须是4的整数倍

    • 如0、4、8等

  • 示例: 0x12345678是⼀个Word型数据,它必须存储在四的整数倍地址上,不能随意存储在其他地址

Half Word型数据的存储规则:

  • 位数: 占两个字节

  • 存储规则: Half Word型数据在内存中的起始地址必须是2的整数倍

    • 如0、2、4 等

  • 示例: ⼀个Half Word数据可以存储在0、2、4等地址上,但不能存储在1、3、5等地址上

(2)字节序

① 概念

ARM一般使用小端对齐

大端对齐: 低地址存放高位,高地址存放低位

  • 例: 假设有数据a=0x12345678,其在内存中的存储如下图

小端对齐: 低地址存放低位,高地址存放高位

  • 例: 假设有数据a=0x12345678,其在内存中的存储如下图

② 判断大小端

示例程序: 通过定义一个int型数据,然后读取其首地址值进行打印,如为大端则其值为0x12,如为小端则为0x78

#include <stdio.h>

int main(){
    unsigned int a = 0x12345678;
    char * pa = &a;
    printf("*pa = %x\n",*pa);
    return 0;
}

执行结果: 下面是在Ubuntu24.01中执行的结果,其为小端存储

root@myServer:~/# ./a.out 
*pa = 78

(3)ARM指令存储

简述: 根据处理器使用不同的指令集,其指令存储方式也分为两种

  • 总结一句话"指令本身是多少位在内存存储时就应该多少位对齐"

处理器处于ARM状态时:

  • 所有指令在内存的起始地址必须是4的整数倍

  • PC值由其[31:2]决定,[1:0]位未定义

处理器处于Thumb状态时:

  • 所有指令在内存的起始地址必须是2的整数倍

  • PC值由其[31:1]决定,[0]位未定义

三.ARM工作模式

针对的是ARM cortex-A9 平台,不同平台可能存在差异

1.基本工作模式

简述: ARM共有8个基本的工作模式

  • User 非特权模式,一般在执行上层的应用程序时ARM处于该模式

  • FIQ 当一个高优先级中断产生后ARM将进入这种模式

  • IRQ 当一个低优先级中断产生后ARM将进入这种模式

  • SVC 当复位或执行软中断指令后ARM将进入这种模式

  • Abort 当产生存取异常时ARM将进入这种模式

  • Undef 当执行未定义的指令时ARM将进入这种模式

  • System 使用和User模式相同寄存器集的特权模式

  • Monitor 为了安全而扩展出的用于执行安全监控代码的模式

2.不同工作模式

  1. 不同模式拥有不同权限: 不同的⼯作模式拥有不同的操作CPU资源的权限

    1. 这是为了保护系统

  2. 不同模式执行不同代码: 不同的⼯作模式执⾏不同的代码,完成不同的任务

    1. User模式: 执⾏上层应⽤程序。

    2. IRQ模式: 处理硬件请求,如⽹卡拆包。

    3. SVC模式: 系统复位后进⼊,执⾏初始化代码

  3. 不同模式完成不同功能: 每种⼯作模式都有其特定的功能

    1. User模式: 主要完成普通应⽤程序的执⾏

    2. FIQ/IRQ模式: 可能完成拆包等硬件请求处理

    3. SVC模式: 完成系统启动或初始化等任务

3.ARM工作模式分类

  1. 按照权限: User为非特权模式(权限较低),其余模式均为特权模式(权限较高)

  2. 按照状态: FIQIRQSVCAbortUndef属于异常模式,即当处理器遇到异常后会进入对应的模式

    • 即CPU遇到不正常的事才会进入的模式

版权声明:
作者:HonestLiu
链接:https://www.ernestliu.xyz/index.php/2025/04/13/1-introductiontoarmprocessors/
来源:墨码手记
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>