Linux入门DAY43 ARM 架构基础、寄存器、大小端、异常向量、交叉编译

#ARM #嵌入式 #Cortex‑A7 #裸机开发 #Linux驱动

前言

最近开始学习 ARM 裸机开发,整理第一天课堂笔记,包含 RISC/CISC 对比、ARM 内核寄存器、冯诺依曼架构、大小端模式、移位操作、Flash 区别、MMU、异常向量表等基础知识点,适合嵌入式、Linux 驱动入门同学参考。

说明:本文基于 Cortex‑A7 32 位 ARMv7 架构整理

一、CISC 与 RISC 指令集

1. CISC 复杂指令集计算机

  • 指令功能丰富多样
  • 芯片内部电路复杂
  • 成本高、体积大、功耗高

2. RISC 精简指令集计算机(Reduced Instruction Set Computer)

  • 指令功能少,每条指令简单
  • 芯片硬件简单
  • 成本低、体积小、功耗低

✨ARM 就是典型 RISC 架构 CPU 设计公司,ARM 不生产芯片,只输出架构授权,由半导体厂商生产芯片。

ARM 内核三大系列

表格

内核系列 用途 代表型号
Cortex‑A 应用处理器,跑操作系统 Linux/Android A7(IMX6ULL、STM32MP157)、A5、A8、A9
Cortex‑R 实时领域,汽车电子,高实时性 Cortex‑R 系列
Cortex‑M 单片机 MCU,裸机单片机开发 M3(STM32F103)、M4(STM32F407)

注意区分:内核版本(Cortex‑A7)≠指令集版本(ARMv7 / ARMv8)

二、冯・诺依曼架构

指令和数据存放在同一块存储器空间,共享存储器总线,早期 ARM 大多采用冯诺依曼架构。

三、ARM32 通用寄存器组(Cortex‑A)

ARM32 一共有 16 个通用寄存器 R0~R15:

  1. R0‑R12:通用数据寄存器,用来临时存放运算数据,配合 ALU 算术逻辑单元完成加减移位运算
  2. R13 = SP(Stack Pointer)栈指针寄存器
    • 栈规则:先进后出,后进先出
    • 出栈:从 SP 指向地址取出数据,随后 SP 自增
  3. R14 = LR(Link Register)链接寄存器
    • 保存函数返回地址,函数调用时保存下一条指令地址,函数返回使用 LR 回到调用处
  4. R15 = PC(Program Counter)程序计数器
    • 程序指针,保存下一条要执行指令的地址,不是当前正在执行的指令!

状态寄存器

  1. CPSR:当前程序状态寄存器,记录当前 CPU 运行状态、条件标志位
  2. SPSR:备份程序状态寄存器 发生异常的时候,保存 CPSR 现场;异常退出,把 SPSR 恢复回 CPSR。

MMU 内存管理单元

  • 作用:虚拟地址 ↔ 物理地址转换,依靠页表完成映射
  • 裸机开发:一般关闭 MMU,直接操作物理地址
  • Linux 驱动:必须打开 MMU,程序使用 4GB 虚拟地址空间

四、大小端存储模式

内存存储多字节数据,区分大端、小端:

  1. 大端模式:低内存地址存高字节,高内存地址存低字节
  2. 小端模式:低内存地址存低字节,高内存地址存高字节

ARM 芯片可以配置大小端,默认一般小端。

示例代码理解:

复制代码
int i = 0xFFFFFFFF;
i += 1; //发生无符号溢出

五、ARM 移位指令(3 种右移)

  1. 逻辑右移 LSR(无符号数) 移出低位,最高位补 0,无视符号位

1011 0010 LSR #1 → 0101 1001

  1. 算术右移 ASR(有符号数) 移出低位,最高位补符号位,保留正负号

1011 0010 ASR #1 → 1101 1001

  1. 循环右移 ROR 最低位移出,直接填充到最高位,循环轮转

1011 0010 ROR #1 → 0101 1001

六、Nor Flash 和 Nand Flash

  1. Nor Flash 每一个字节都可以直接寻址,引出独立地址总线 + 数据总线,可以直接运行代码。
  2. Nand Flash 块设备,以块(常见 512 字节)为单位读写,不能直接执行代码,需要把代码拷贝到内存再运行。

七、交叉编译

在 A 平台编写、编译代码,生成可执行程序,放到架构不同的 B 平台运行。

例子:PC (x86) 编译 ARM 架构程序,拷贝到 IMX6ULL 开发板运行,需要 ARM 交叉编译器。

八、中断向量表 & 异常向量表

  1. 中断向量表:数组,存放中断服务函数入口地址
  2. 异常向量表:数组,存放跳转指令,跳转到异常服务函数

向量表基地址可以配置,ARM9/ARM11 默认0xFFFF0000,也可以设置到 0x0 地址。 异常类型包含:Reset 复位、未定义指令、软中断、预取中止、数据中止、IRQ 普通中断、FIQ 快速中断。

九、总线简单概念

  1. 单总线:内核和外设共用一组总线,性能差
  2. AHB 先进高速总线:高速外设使用,速度更快。

小结 Day01 重点

  1. ARM 是 RISC 精简指令集,分 A/R/M 三大内核;区分内核版本和指令集版本
  2. 牢记 SP、LR、PC 三个特殊寄存器功能
  3. MMU 实现虚拟地址转物理地址,裸机关闭 MMU,Linux 开启 MMU
  4. 分清逻辑右移 LSR、算术右移 ASR、循环右移 ROR
  5. Nor Flash 可以字节寻址;Nand Flash 按块访问
  6. 异常向量表存放跳转指令,是裸机中断、异常处理的基础
相关推荐
ι:1 小时前
NUC12 Pro 安装 Ubuntu 24.04 LTS 详细教程
linux·windows·ubuntu·nuc
代码村新手2 小时前
Linux-进程概念
linux
ShineWinsu2 小时前
对于Git:基础操作的超详细保姆级解析
linux·c++·git·面试·备份·管理·版本控制器
菜鸟学编程o2 小时前
Linux常见指令
linux·运维·服务器
幼儿园蛋小黑3 小时前
ARM 汇编入门:从基础指令到实战示例
arm
linan1013 小时前
android调用C++通用方式
linux·架构·智能硬件
索端阳4 小时前
ARM Day02 学习总结:ARM汇编基础核心知识点梳理
汇编·学习·arm
imaol14 小时前
网络通信-网络编程
linux·udp
Awh-4 小时前
ARM裸机开发 Day01 学习笔记
arm开发·arm·arm裸机