FreeRTOS学习笔记(六):汇编指令笔记
文章目录
- 一、 MSR 和 MRS
- 1. MRS指令(Move to Register from Special register)
- 2. MSR指令(Move to Special register from Register)
- 典型应用场景
- 重要说明
- 二、 DSB 和 ISB
- 1. DSB(Data Synchronization Barrier)
- 2. ISB(Instruction Synchronization Barrier)
- 关键区别
- 总结
/* 任务句柄 */
typedef void * TaskHandle_t;//通用指针或泛指针。指向某个对象,但该对象不属于任何类型
一、 MSR 和 MRS
在ARM汇编中,MSR
和MRS
是用于访问特殊寄存器(Special Registers)的指令,它们在系统级编程中非常重要,通常用于配置处理器状态、中断控制、内存管理等核心功能。
1. MRS指令(Move to Register from Special register)
- 功能:将特殊寄存器的值读取到通用寄存器中
- 语法:
MRS{条件码} 通用寄存器, 特殊寄存器
- 示例:
MRS R0, CPSR ; 将当前程序状态寄存器(CPSR)的值读取到R0 MRS R1, SPSR ; 将保存的程序状态寄存器(SPSR)的值读取到R1 MRS R2, SCTLR ; 读取系统控制寄存器到R2(ARMv7及以上)
- 用途:通常用于读取处理器状态、配置信息等,以便进行检查或修改
2. MSR指令(Move to Special register from Register)
- 功能:将通用寄存器的值写入到特殊寄存器中
- 语法:
MSR{条件码} 特殊寄存器, 通用寄存器
或使用立即数操作(部分寄存器支持):MSR{条件码} 特殊寄存器, #立即数
- 示例:
MSR CPSR_c, R0 ; 将R0的值写入CPSR的控制位域(c表示控制位) MSR SPSR, R1 ; 将R1的值写入SPSR MSR SCTLR, R2 ; 将R2的值写入系统控制寄存器 MSR CPSR_c, #0x1F ; 设置CPSR的控制位(进入用户模式)
- 注意:
- 对于CPSR/SPSR,通常使用位域限定符(如
_c
、_x
、_s
、_f
)指定要修改的部分 - 很多特殊寄存器的访问受到权限限制,只能在特权模式下操作
- 对于CPSR/SPSR,通常使用位域限定符(如
典型应用场景
-
模式切换:通过修改CPSR的M位域切换处理器模式
MRS R0, CPSR ; 读取当前CPSR BIC R0, R0, #0x1F ; 清除模式位 ORR R0, R0, #0x13 ; 设置为SVC模式 MSR CPSR_c, R0 ; 写入CPSR的控制位域
-
中断控制:启用或禁用中断
MRS R0, CPSR ORR R0, R0, #0xC0 ; 禁用IRQ和FIQ中断 (设置I位和F位) MSR CPSR_c, R0
-
系统配置:配置内存管理单元(MMU)、缓存等
MRS R0, SCTLR ; 读取系统控制寄存器 ORR R0, R0, #0x1 ; 置位MMU使能位 MSR SCTLR, R0 ; 启用MMU
重要说明
- 特殊寄存器的种类和功能因ARM架构版本(如ARMv6、ARMv7、ARMv8)而异
- 错误使用这些指令可能导致系统崩溃或安全漏洞
- 在ARMv8的AArch64模式下,这些指令的语法和支持的寄存器有所变化
这些指令是操作系统内核、引导程序和设备驱动程序开发的基础工具,用于直接控制处理器的核心功能。
在ARM汇编中,DSB
(Data Synchronization Barrier)和ISB
(Instruction Synchronization Barrier)是内存屏障指令(Memory Barrier Instructions),用于控制指令和数据的执行顺序,确保内存操作的可见性和顺序性,在多处理器系统、设备驱动和实时系统中尤为重要。
二、 DSB 和 ISB
1. DSB(Data Synchronization Barrier)
-
功能:确保在
DSB
指令执行完成前,所有之前的内存访问操作(加载/存储)都已完成,并且其结果对系统中的其他组件(如其他处理器、DMA控制器)可见。 -
作用:阻止后续的内存操作执行,直到所有先前的内存操作彻底完成(包括写入实际物理内存、缓存一致性同步等)。
-
语法:
DSB <option>
其中<option>
指定作用范围(可选,默认是完整屏障):#SY
:系统级屏障(默认),影响所有内存访问#ST
:仅影响存储操作(Store)#LD
:仅影响加载操作(Load)
-
示例:
; 确保所有之前的存储操作完成后,再读取设备状态 STR R0, [R1] ; 向设备寄存器写入命令 DSB ; 等待写入完成 LDR R2, [R1, #4] ; 读取设备状态(确保读取到的是最新状态)
-
典型用途:
- 设备驱动中,确保对硬件寄存器的写入已生效后再进行后续操作
- 多处理器间共享数据时,保证数据更新的可见性
- 内存映射I/O操作中,避免读写操作乱序
2. ISB(Instruction Synchronization Barrier)
-
功能:刷新处理器的指令流水线(Instruction Pipeline),确保
ISB
之后的指令从更新后的指令缓存或内存中重新取指执行。 -
作用:使所有之前的指令(包括修改系统状态的指令,如
MSR
)的效果在后续指令中可见,强制流水线重新同步。 -
语法:
ISB <option>
可选<option>
与DSB
类似,默认#SY
。 -
示例:
; 修改处理器状态后,确保后续指令在新状态下执行 MRS R0, CPSR ; 读取状态寄存器 ORR R0, R0, #0x80 ; 修改中断屏蔽位 MSR CPSR_c, R0 ; 写入新状态 ISB ; 刷新流水线,确保后续指令使用新状态
-
典型用途:
- 修改处理器状态(如中断使能、内存管理配置)后,确保后续指令按新状态执行
- 代码自修改(如动态生成指令)后,确保新指令被正确取指
- 切换内存映射(如页表更新)后,避免旧映射的指令被错误执行
关键区别
指令 | 核心作用 | 影响范围 | 典型场景 |
---|---|---|---|
DSB | 确保数据访问的顺序和完成 | 内存操作(加载/存储) | 设备I/O、共享内存同步 |
ISB | 确保指令执行的顺序和同步 | 指令流水线和取指 | 状态修改、代码更新 |
总结
DSB
和ISB
是ARM架构中保证系统正确性的关键指令,尤其在:
- 多处理器或多核系统中维护内存一致性
- 与硬件设备交互时确保操作顺序
- 修改处理器核心配置(如中断、MMU)后保证状态同步
错误省略这些指令可能导致难以调试的问题(如数据不一致、指令执行异常),尤其是在高性能或实时系统中。