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》资源

相关文章
相关标签/搜索