中斷控制器是鏈接設備和CPU的橋樑,一個設備產生中斷後,須要通過中斷控制器的轉發,才能最終到達CPU。在UP(Uni-processor,單處理器)時代,x86主要使用的中斷控制器爲PIC(Programmable Interrupt Controller)。隨着SMP(Symmetric Multiple Processor,對稱多處理器)的流行,APIC(Advanced Programmable Interrupt Controller)已廣爲流行並將最終取代PIC。數據結構
操做系統經過表獲取平臺上硬件中斷系統的信息,表是BIOS報告系統資源信息的一般方式。MP spec定義了MP table,ACPI規範定義了MADT(Multiple APIC Description Table)。雖然構建方式不同,可是從OS看來二者大同小異,都支持LAPIC entry、I/O APIC entry,以及其餘幾個與之相關的entry。這些entry描述了平臺APIC硬件的狀況。ide
因爲歷史緣由,SylixOS一樣定義了一組符合MP spec的數據結構來管理平臺硬件。ACPI被引入後,雖然彙報硬件資源的方式變了,但仍可使用MP spec的數據結構管理。SylixOS的ACPI解析路徑,其實是使用了ACPI的方式讀表,填充MP spec的數據結構。函數
SylixOS中定義的MP spec結構體中,和中斷相關以下所示: X86_MP_IOAPIC:對應MP spec的I/O APIC entry,以下所示。ui
typedef struct { /* MP Config Table Entry for IO APIC's */ UINT8 IOAPIC_ucEntryType; /* 2 identifies an IO APIC entry */ UINT8 IOAPIC_ucIoApicId; /* ID of this IO APIC */ UINT8 IOAPIC_ucIoApicVersion; /* Version of this IO APIC */ UINT8 IOAPIC_ucIoApicFlags; /* Usable or not */ UINT32 IOAPIC_uiIoApicBaseAddress; /* Address of this IO APIC */ } X86_MP_IOAPIC;
X86_MP_INTERRUPT:對應MP spec的I/O interrupt entry,表明各個中斷源(一個I/O APIC管腳鏈接一箇中斷源),以下所示。this
typedef struct { UINT8 INT_ucEntryType; UINT8 INT_ucInterruptType; UINT16 INT_usInterruptFlags; UINT8 INT_ucSourceBusId; UINT8 INT_ucSourceBusIrq; UINT8 INT_ucDestApicId; UINT8 INT_ucDestApicIntIn; } X86_MP_INTERRUPT;
SylixOS將全部從MP spec以及ACPI探測出的數據所有保存在全局變量_G_pAcpiMpApicData中。其中中斷源信息保存在該結構體成員MPAPIC_uiItLoc指定的地址中,共MPAPIC_uiItSize個。此外,全局變量_G_pX86MpApicInterruptTable一樣保存了中斷信息表的起始地址。操作系統
MP spec的相關代碼在「libsylixos/SylixOS/arch/x86/mpconfig」目錄中,ACPI規範的相關代碼在「libsylixos/SylixOS/arch/x86/acpi」目錄中。MP和ACPI實例的初始化接口以下所示。code
#include "arch/x86/mpconfig/x86MpApic.h" INT x86MpApicInstInit (VOID);
函數x86MpApicInstInit原型分析:接口
SylixOS在x86MpApicInstInit函數中提供了4條中斷探測路徑,即MP spec路徑、ACPI路徑、用戶自定義路徑,以及非多核路徑。目前系統默認啓動選項爲ACPI路徑。ip
《Interrupt in Linux》資源