SylixOS x86中斷探測

  1. x86中斷探測簡介

  中斷控制器是鏈接設備和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的數據結構。函數

  1. 技術實現

  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原型分析:接口

  • 此函數成功返回ERROR_NONE,失敗返回錯誤碼;

  SylixOS在x86MpApicInstInit函數中提供了4條中斷探測路徑,即MP spec路徑、ACPI路徑、用戶自定義路徑,以及非多核路徑。目前系統默認啓動選項爲ACPI路徑。ip

  1. 參考資料

《Interrupt in Linux》資源

相關文章
相關標籤/搜索