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()代码解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [crypto]-51-RSA私钥pem
- 下一篇: armv8/armv7中SCTLR的区别