ARM①——模式&环境调试

ARM①——模式&环境调试

一、架构

ARM架构

1、A

该架构的芯片,性能高

2、R

该架构的芯片,满足实时性要求的场景

3、M

该架构的芯片,规模较小,主要用于控制操作等


X86架构

AMD、英特尔等PC用的芯片采用X86架构


CPU/SOC

soc是cpu加上其他各种集成模块组合到一起。

对比维度 CPU (Central Processing Unit) 中央处理器 SoC (System on a Chip) 系统级芯片
本质定位 专注于 “数据运算与指令执行” 的单一核心部件 集成 “完整功能系统” 的超大规模芯片
核心功能 仅负责逻辑运算、数据处理、指令调度(如算术计算、程序控制) 覆盖 “计算 + 存储 + 外设 + 通信” 全流程,可独立完成系统任务
集成范围 仅包含运算器(ALU)、控制器、寄存器等核心模块(部分现代 CPU 会集成缓存,但无其他外设) 必含 CPU,同时集成 GPU、内存(RAM)、存储(ROM/Flash)、蓝牙 / WiFi 芯片、USB 控制器、传感器接口等
独立性 无法单独工作,需依赖外部芯片(如北桥 / 南桥、显卡、内存)才能构成完整系统 可独立工作,外接电源和简单外设(如屏幕、按键)即可实现设备功能

二、嵌入式

软件

应用层:

​ C++、Qt、进线程IO、网络编程等

中间件:

​ linux、C

底层:

​ stm32 + FreeRTOS

​ ARM-A + linux(系统移植、驱动、性能优化等)

硬件

电路板设计、PCB、EDA等

CPU:运算器、控制器、寄存器

存储:三级存储,高速缓存(cache)

alt

输入:鼠标、键盘等

输出:显示器等

总线:数据传输的通道

  • 单总线 哈佛结构
  • 多总线 冯诺依曼结构

效率

  • 多总线
  • 集成度
  • 三级流水线

三、ARM指令

alt

ARM指令集 32位

Thumb指令集 16位

工作模式

模式名称 英文缩写 核心用途 主要特点
用户模式 User 普通应用程序运行的模式,是权限最低的模式 无 SPSR 寄存器;不能直接切换到其他模式(需通过异常触发);多数应用程序在此模式执行
系统模式 System 操作系统内核运行的特权模式,用于执行系统级任务 与用户模式共享相同的寄存器集;有 SPSR(但通常不用,因不通过异常进入);拥有最高权限
超级用户模式 SVC(Supervisor) 处理软件中断(如系统调用SWI指令)和上电复位后的初始模式 异常模式之一,有专属 SPSR(SPSR_SVC);用于操作系统内核处理服务请求
中断请求模式(低优先级) IRQ 处理普通中断(如外设中断:键盘、定时器、UART 等) 异常模式之一,有专属 SPSR(SPSR_IRQ);进入时自动屏蔽新的 IRQ 中断(I 位 = 1)
快速中断请求模式(高优先级) FIQ 处理需要快速响应的高优先级中断(如高速数据传输:DMA、图像传感器) 异常模式之一,有专属 SPSR(SPSR_FIQ);寄存器更多(8 个私有寄存器),响应速度更快;进入时屏蔽 IRQ 和 FIQ 中断(I=1,F=1)
中止模式 ABT(Abort) 处理内存访问异常(如数据访问中止、指令预取中止:非法地址、权限错误) 异常模式之一,有专属 SPSR(SPSR_ABT);用于操作系统处理内存错误(如段错误)
未定义指令模式 UND(Undef) 处理未定义的指令(如执行处理器不支持的指令) 异常模式之一,有专属 SPSR(SPSR_UND);用于软件模拟未实现的指令(如协处理器指令)
Monitor 模式 Monitor 1. 处理安全监控调用(SMC 指令),实现安全世界与非安全世界的切换2. 管理两个世界的资源隔离(如内存、外设的安全权限)3. 执行安全相关的监控任务(如安全异常处理) 1. 仅存在于支持 TrustZone 的处理器(如 Cortex-A9)中2. 拥有独立的 SPSR(SPSR_mon),用于保存切换前的状态3. 只能通过特定方式进入:- 非安全世界执行SMC(Secure Monitor Call)指令- 安全世界或非安全世界发生的安全相关异常4. 权限高于普通模式,是连接两个世界的 “安全网关”

alt

  • 除USER、SYSTEM模式外,其他模式都算异常模式
  • System模式使用user模式寄存器集
  • CPSR——所有模式下共用的唯一程序状态寄存器,保存切换状态前的状态
  • SPSR——异常状态下的状态备份寄存器,USER和SYSTEM下没有该寄存器
  • R13 SP 栈顶寄存器,存栈顶地址
  • R14 LR 保存跳转地址
  • R15 PC 保存当前指令的地址的寄存器(程序计数寄存器)
  • R0-R12 通用寄存器
  • cortex A 一共有40个寄存器,其余的37个寄存器

汇编指令

  1. 了解计算机的运行规律
  2. 逆向工程(反向编译,二进制==>汇编)

环境配置

​ 交叉编译环境 arm-linux-gcc

ARM 与开发主机(如 x86)的指令集不兼容,必须借助交叉编译工具链(如arm-linux-gcc),才能在性能更强的开发主机上,生成符合 ARM 指令集、能在 ARM 设备运行的代码;

初步调试

【环境搭建 - 安装 arm-linux-gcc 和虚拟开发板】

1、解压 gcc-4.6.4.tar.xz 到 主目录(家目录:/home/hqyj/ 根据自己Ubuntu命名) tar -xvf gcc-4.6.4.tar.xz

2、确认解压完成,可以进入~/gcc-4.6.4/bin 下面看到 arm-linux-gcc 命令cd ~/gcc-4.6.4/bin pwd 获取绝对路径 /home/hqyj/gcc-4.6.4/bin

3、修改配置文件~/.bashrc,添加环境变量

(1).vi ~/.bashrc ,在最后一行添加 路径消息

export PATH=$PATH:/home/hqyj/gcc-4.6.4/bin

(2).保存退出后:wq,执行 source ~/.bashrc

(3).关闭所有终端

4、安装虚拟开发板 qemu-system-arm:

sudo apt-get install qemu-system

在 ~/.bashrc 最后一行添加: export LC_ALL=C

5、调试

arm-linux-gcc tset.S -o test.o -c -g

arm-linxu-ld  test.o -o test.elf -Ttext=0x00000000

qemu-system-arm  -machine  xilinx-zynq-a9  -m  256M  -serial  stdio  -kernel  test.elf  -S  -s

【 调试端 - 看执行结果】{

再开一个终端,在另外一个终端 执行下面命令:

arm-none-linux-gnueabi-gdb elf文件路径

进入GDB后,执行

(gdb) target remote 127.0.0.1:1234

(gdb) s

l 查看代码

b 设置断点

s 单步调试

c 继续运行

p 查看变量值 p #r0 p/x val 十六进制

x 查看地址的值 x/4 0x10 从0x10开始连续4个字节

CSPR

alt

1. CPSR 寄存器的位域布局

将 32 位寄存器按功能划分为多个位段,从高位(31 位)到低位(0 位)依次包括:

  • 条件标志位(NZCV);
  • QJDNM(Do Not Modify,禁止修改)、GE[3:0]IT[7:2]
  • 控制位(EAIFT);
  • 模式位M[4:0]

2. 各主要位域的功能说明

  • 条件位(NZCV:由 ALU(算术逻辑单元)运算结果自动设置,用于 “条件指令执行”(如BEQBNE)的判断:
    • N(Negative):运算结果为负数时置 1;
    • Z(Zero):运算结果为 0 时置 1;
    • C(Carry/Borrow):加法有进位或减法有借位时置 1;
    • V(Overflow):运算发生有符号溢出时置 1。
  • 特殊功能位
    • Q位:仅 ARM v5TE-J 架构支持,指示 “饱和运算” 状态;
    • J位:仅 ARM v5TE-J 架构支持,用于标识 “Jazelle 状态”(Java 字节码执行模式);
    • GE[3:0]:执行 SIMD 指令时有效,表示 “大于或等于” 的比较结果;
    • IT[7:2]:Thumb-2 指令集的 “IF…THEN” 条件执行状态位。
  • 控制位
    • E:大小端(字节序)控制位;
    • A:禁止 “不精确数据异常”(A=1时禁止);
    • I/F:中断禁止位(I=1禁止 IRQ 普通中断,F=1禁止 FIQ 快速中断);
    • T:指令集状态位(T=0为 ARM 状态,执行 32 位 ARM 指令;T=1为 Thumb/ThumbEE 状态,执行 16/32 位缩略指令)。
  • 模式位M[4:0]:定义处理器运行模式(如10000为用户模式、10001为 FIQ 模式、10011为 SVC 模式等),不同模式对应不同的权限和寄存器可见性。

3. CPSR/SPSR 的操作指令

  • MRS指令:将 CPSR(或 SPSR)的值读取到通用寄存器,例:mrs r0, CPSR(把 CPSR 的值读入r0)。
  • MSR指令:将通用寄存器的值写入 CPSR(或 SPSR),例:msr CPSR, r0(把r0的值写入 CPSR)。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务