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. 异常向量表存放跳转指令,是裸机中断、异常处理的基础
相关推荐
阳光九叶草LXGZXJ4 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
奔跑的大白啊5 小时前
多容器共享目录权限踩坑记
linux·ubuntu·共享目录·linux权限·docker 容器化部署
Android系统攻城狮8 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
H.莓飛8 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
91刘仁德8 小时前
IP协议详解:从IP协议头到网段划分、路由与NAT
linux·服务器·网络·网络协议·tcp/ip
硅基手札9 小时前
【Linux内核专栏 14】网络协议栈
linux·运维·网络协议
沫璃染墨11 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
工作10年+,存储芯片行业11 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie
wuminyu11 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++
她说彩礼65万12 小时前
C语言 堆区和栈区
java·linux·c语言