2009年2月15日 星期日

Linux Interrupts and Exceptions - 1

Intel x86 處理器將中斷分成 同步的 Exception 以及 非同步的 Interrupt 兩類
並且給與 0-255 的識別號碼,稱之為 vector,在 Linux 核心則被稱為 IRQ Number

• Exceptions
由 CPU 產生的中斷,例如:執行指令時發生錯誤,或是使用者程式的系統呼叫
目前 x86 處理器定義了 20 個 Exception,即 IRQ Number 0-19,如下表所示:


• Interrupts
由其他硬體裝置或計時器發出的中斷,通常是將裝置的 IRQ Line 全部接到一顆
Programmable Interrupt Controller (PIC) 的控制晶片上,當裝置發出中斷時,由這顆 PIC 來通知 CPU
舊型的 PC 會使用兩個 Intel 8259 來串接成為中斷控制器,可處理 15 個硬體裝置的中斷要求
x86 處理器的 Interrupt 則是定義為 IRQ Number 32-255,如下圖所示:

對於多處理器的系統,則是使用新型的 Advanced Programmable Interrupt Controller (APIC)
來代替 8259 管理裝置的中斷,並具有單處理器系統的相容性

APIC 是由 Local APIC (LAPIC) 及 I/O APIC (IOAPIC) 兩部份所組成,LAPIC 位於 CPU 端,IOAPIC 位於南橋晶片上
多處理器系統的每個 CPU 會有一個 LAPIC,搭配一個連接硬體裝置的 IOAPIC,如下圖:



此外,x86 處理器使用 8 bytes 的 IDT descriptors 來描述中斷,分為三種型別:
1. Task Gate
2. Interrupt Gate
3. Trap Gate


Linux 則使用 256*8 = 2048 bytes 的空間,來儲存 CPU 全部 256 個中斷的 IDT 值
並且以 Interrupt Gate 來處理 Interrupt 的中斷,以 Trap Gate 來處理 Exception 的中斷,如下:

struct desc_struct { unsigned long a,b;};

定義於 include/asm-i386/processor.h


struct desc_struct idt_table[256] __attribute__((__section__(".data.idt"))) = { {0, 0}, };

定義於 arch/i386/kernel/traps.c