初步了解Linux内核中断初始化
? ? 在linux內核中,用struct irq_chip結構體描述一個可編程中斷控制器,它的整個結構和調度器中的調度類類似,里面定義了中斷控制器的一些操作;
? ? 在中斷處理中所涉及的幾個重要的數據結構:中斷描述符(struct irq_desc),中斷控制器描述符(struct irq_chip),中斷服務例程(struct irqaction)。它們的組織形式如下:
?
?
中斷初始化概述
中斷相關的數據結構組成了整個內核中斷框架主體,所以內核對整個中斷的初始化工作大多集中在了這幾個結構上;
? 在系統中,當一個中斷產生時,首先CPU會從中斷向量表中獲取相應的中斷向量,并根據中斷向量的權限位判斷是否處于該權限,之后跳轉至中斷處理函數,在中斷處理函數中會根據中斷向量號獲取中斷描述符,并通過中斷描述符獲取此中斷對應的中斷控制器描述符,然后對中斷控制器執行應答操作,最后執行此中斷描述符中的中斷服務例程鏈表,最后執行軟中斷;
而整個初始化的過程與中斷處理過程相應,首先先初始化中斷向量表,再初始化中斷描述符表和中斷描述符;
? ? 中斷控制器描述符是系統預定編寫好的靜態變量,如i8259A中斷控制器對應的變量就是i8259A_chip;
這時一個中斷已經初始化完畢,之后驅動需要使用此中斷時系統會將驅動中的中斷處理加入到該中斷的中斷服務例程鏈表中;
? ? 如下圖,
?
?初始化中斷向量
雖然稱之為中斷向量表,其實對于CPU來說只是一個起始地址,此地址開始每向上8個字節為一個中斷向量。我們的CPU上有一個idtr寄存器,它專門用于保存中斷向量表地址,當產生一個中斷時,CPU會自動從idtr寄存器保存的中斷向量表地址處獲取相應的中斷向量,然后判斷權限并跳轉至中斷處理函數。當計算機剛啟動時,首先會啟動引導程序(BIOS),在BIOS中會把中斷向量表存放在內存開始位置(0x00000000)。BIOS會有自己的一些默認中斷處理函數,而當BIOS處理完后,會將計算機控制器轉交給linux,而linux會在使用BIOS的中斷向量表的同時重新設置新的中斷向量表(新的地址保存在配置中的CONFIG_VECTORS_BASE),之后會完全使用新的中斷向量表;
總結
以上是生活随笔為你收集整理的初步了解Linux内核中断初始化的全部內容,希望文章能夠幫你解決所遇到的問題。