Linux教程

linux kernel中local_irq_disable()、local_irq_enable()代码解读

本文主要是介绍linux kernel中local_irq_disable()、local_irq_enable()代码解读,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在armv8-arch64架构下,控制cpu是否响应IRQ,FIQ,SERROR,DEBUG中断,是由PSTATUS(daif寄存器)控制的。
在armv8-arch32或armv7架构下,控制cpu是否响应IRQ,FIQ,SERROR,DEBUG中断,CPSP中的 D A I F bit位控制的。

本文只讨论armv8-arch64架构下的linux kernel程序:

首先,local_irq_disable()、local_irq_enable()的实现就是写daif寄存器,与具体中断控制器无关,具体实现在irqflags.h中:
local_irq_disable() : disable当前cpu的IRQ
local_irq_enable() : enable当前cpu的IRQ
注意这里没有任何FIQ,SERROR,DEBUG bit的操作,操作的仅仅是IRQ的bit位。

在这里插入图片描述

另外搜索了整个linux kernel code,操作daif寄存器的地方只有两处,一处就是irqflags.h这里,另外一处就是建立页表的时候
临时disable了D A I F ,然后又恢复之前的值。

总结:在arm64 linux中,没有debug/serror/fiq的bit操作,local_irq_disable()、local_irq_enable()函数操作的也仅仅是IRQ bit位。
当然了,IRQ,DEBUG,SERROR是可以在linux kernel之前的阶段中enable/disable的。如在ATF中enable了SERROR。

这篇关于linux kernel中local_irq_disable()、local_irq_enable()代码解读的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!