中斷分析(五)

2021-05-27 00:34:59 字數 2311 閱讀 9727

中斷分析(五)

——初始化中斷描述符表的具體實現    

一、中斷描述符表的預初始化:

用256個指向ignore_int中斷門的入口位址填充中斷描述符表。它不是真正的初始化idt,等到分頁和核心跳轉到page_offset處時才真正的進行初始化。確定所有相關的準備都已就緒之後,中斷可以在任何地方發生。

setup_idt:

lea ignore_int,%edx  //取ignore_int的有效位址到edx暫存器

movl $(__kernel_cs << 16),%eax    #把核心**段選擇符左移16位,送到eax寄              存器,此時eax的高16位存放選擇符。

movw %dx,%ax        /* selector = 0x0010 = cs */ #ignore_int的有效位址存入eax的底16位。此時,eax中含有門描述符底4位元組(32位)的值。

movw $0x8e00,%dx    /* interrupt gate - dpl=0, present */  #edx中含有門描述符高4字                       節的值。

lea symbol_name(idt_table),%edi //取中斷描述符表的位址到edx中

mov $256,%ecx

rp_sidt:

movl %eax,(%edi)    #//將通用的中斷描述符存入表中(將ignore_int存入edi所指向的位址中)

movl %edx,4(%edi)    #eax內容放到edi+4所指記憶體位置處

addl $8,%edi          #edi指向表中下一項 

dec %ecx

jne rp_sidt         #條件跳轉,使得idt表有256項

retignore_int()中斷處理程式,可以看作是乙個空的處理程式,它執行的主要動作有:

1、在棧中儲存一些暫存器的內容。

2、呼叫printk()函式列印「unknown interrupt」系統訊息。

3、恢復棧中暫存器的內容。

4、執行iret指令,恢復被中斷的程式。

ignore_int:   

cldpushl %eax

pushl %ecx

pushl %edx

pushl %es

pushl %ds

movl $(__kernel_ds),%eax

movl %eax,%ds

movl %eax,%es

pushl $int_msg

call symbol_name(printk)

popl %eax

popl %ds

popl %es

popl %edx

popl %ecx

popl %eax

iret

二、中斷描述符表的第二遍初始化

在上述預初始化之後後,核心將在idt中進行第二遍初始化,用有意義的陷阱和中斷處理程式替換空處理程式。第二遍處理過程完成後,針對控制單元產生的每個不同的異常,idt都有乙個專門的陷阱門或系統門;而對於可程式設計控制器確認的每乙個irq,idt都將包含乙個專門的中斷門。trap_init()函式的工作就是將一些處理異常的函式插入到idt的非遮蔽中斷及異常表項中。

由於核心中只用到了陷阱門和系統門,因此只考慮對這兩個門的初始化。trap_init()函式用於設定中斷描述符表開頭的19個陷阱門和linux系統中唯一用到的乙個系統門。這些中斷向量都是cpu保留,用於異常處理的。

void __init trap_init(void)

我們可以看到將異常處理函式插入idt的表項是由set_trap_gate()和set_system_gate()函式來完成的。具體實現如下:

設定中斷門函式。其中,引數n表示中斷號;addr是中斷程式偏移位址(相對於核心**或數le據段來說的)。

void set_intr_gate(unsigned int n, void *addr)

設定陷阱門函式。

static void __init set_trap_gate(unsigned int n, void *addr)

設定系統陷阱門函式。與陷阱門不同,系統陷阱門的特權級是3,即系統陷阱門設定的中斷處理過程能夠被所有程序呼叫(如單步除錯、溢位出錯和超出邊界出錯等)

static void __init set_system_gate(unsigned int n, void *addr)

上述門函式都是呼叫_set_gate巨集來實現的。該巨集的具體實現如下:

#define _set_gate(gate_addr,type,dpl,addr) \

do while(0)

ARM Linux 中斷分析

在具體的 arm 晶元中會有很多的中斷型別,每一種型別的中斷用以上結構來表示 struct irqdesc irq desc nr irqs nr irqs 根據不同的 mcu 會有所區別 在通過request irq 函式註冊中斷服務程式的時候,將會把中斷向量和中斷服務程式對應起來。我們來看一下 ...

edge中斷分析

目前正在除錯msix 中斷,在測試過程中發現會概率性的丟失中斷。msix中斷預設是 edge 觸發的中斷,edge 觸發的中斷是在中斷對應 pin發生電平訊號跳變的時候,會發出乙個中斷請求。因為跳變是一瞬間的,不會像 level 觸發中斷那樣一直保持電平不變,這樣就可能會漏掉某乙個跳變的瞬間,表現就...

中斷型別分析

ibm公司的機器,通常把中斷源分為6類 1 重新啟動中斷 這是為操作人員重新啟動乙個重新用的,在一般情況下,處理機不能禁止這類中斷。2 機器檢驗錯中斷 當發生硬體或軟體故障時發生機器校驗錯中斷。用乙個64位的機器檢驗中斷碼儲存中斷的原因及其嚴重程度。在機器的檢驗儲存區中還儲存有更加詳細的中斷原因和故...