linux kernel中local_irq_disable()、local_irq_enable()代码解读
在armv8-arch64架構(gòu)下,控制cpu是否響應(yīng)IRQ,FIQ,SERROR,DEBUG中斷,是由PSTATUS(daif寄存器)控制的。
在armv8-arch32或armv7架構(gòu)下,控制cpu是否響應(yīng)IRQ,FIQ,SERROR,DEBUG中斷,CPSP中的 D A I F bit位控制的。
本文只討論armv8-arch64架構(gòu)下的linux kernel程序:
首先,local_irq_disable()、local_irq_enable()的實(shí)現(xiàn)就是寫daif寄存器,與具體中斷控制器無關(guān),具體實(shí)現(xiàn)在irqflags.h中:
local_irq_disable() : disable當(dāng)前cpu的IRQ
local_irq_enable() : enable當(dāng)前cpu的IRQ
注意這里沒有任何FIQ,SERROR,DEBUG bit的操作,操作的僅僅是IRQ的bit位。
另外搜索了整個(gè)linux kernel code,操作daif寄存器的地方只有兩處,一處就是irqflags.h這里,另外一處就是建立頁表的時(shí)候
臨時(shí)disable了D A I F ,然后又恢復(fù)之前的值。
總結(jié):在arm64 linux中,沒有debug/serror/fiq的bit操作,local_irq_disable()、local_irq_enable()函數(shù)操作的也僅僅是IRQ bit位。
當(dāng)然了,IRQ,DEBUG,SERROR是可以在linux kernel之前的階段中enable/disable的。如在ATF中enable了SERROR。
總結(jié)
以上是生活随笔為你收集整理的linux kernel中local_irq_disable()、local_irq_enable()代码解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [crypto]-51-RSA私钥pem
- 下一篇: armv8/armv7中SCTLR的区别