请阅读【ARMv8/v9 ARM64 System Exception】
在ARMv8/v9架构中,可以使用下面汇编指令来打开FIQ
和 IRQ
,代码如下:
asm volatile ("msr daifclr, 0x3 \n");
下面详细介绍这个函数的组成部分和功能:
asm
关键字用于GCC和一些其他编译器中,表示接下来的字符串是一段内联汇编代码。这允许开发者直接在C或C++代码中嵌入汇编语句。volatile
关键字告诉编译器,该汇编代码具有副作用,应当防止编译器优化掉这段代码。在处理器状态控制或硬件相关操作中,volatile
通常是必需的,以确保代码按照预期执行。msr daifclr, 0x3
是具体的汇编指令: msr
(Move to Special Register)是将一个值移动到一个特殊寄存器的指令。daifclr
是目标特殊寄存器,代表中断掩码寄存器中的"Disable AIF clear"部分,用于控制处理器的中断使能状态。 DAIF
是一个位字段,分别代表Debug异常、SMC调用异常、IRQ(普通中断)、FIQ(快速中断)。0x3
指的是要写入daifclr
寄存器的值,具体含义是清除(使能)中断。在这里,二进制11
(十六进制的0x3
)指的是要清除(即使能)IRQ
和FIQ
中断的禁用状态。具体来说: 0x1
) 控制FIQ中断的禁用位。0x2
) 控制IRQ中断的禁用位。0x3
(0b11
) 表示同时使能FIQ和IRQ中断。也可对FIQ
和 IRQ
进行单独控制,代码如下:
.set DAIF_WR_FIQ_BIT, (1 << 0) .set DAIF_WR_IRQ_BIT, (1 << 1) .set DAIF_WR_ABORT_BIT, (1 << 2) .set DAIF_WR_DEBUG_BIT, (1 << 3) func enable_irq msr daifclr, #DAIF_WR_IRQ_BIT isb ret endfunc enable_irq func disable_irq msr daifset, #DAIF_WR_IRQ_BIT isb ret endfunc disable_irq func enable_fiq msr daifclr, #DAIF_WR_FIQ_BIT isb ret endfunc enable_fiq func disable_fiq msr daifset, #DAIF_WR_FIQ_BIT isb ret endfunc disable_fiq
asm volatile ("msr daifclr, 0x3 \n");
指令的功能是使能IRQ和FIQ中断,确保处理器能够响应这两种类型的中断请求。在嵌入式或操作系统开发中,运行该指令通常意味着你想要在特定的执行点允许处理器开始响应外部或快速中断,这是一种常见的操作,特别是在初始化或关键操作执行前后需要确保中断系统处于正确状态。
通过直接操作特殊寄存器控制中断使能,开发者可以精确控制系统行为,但这也要求高度的谨慎和对平台细节的深入了解。