APIC

       Advanced Programmable Interrupt Controller(APIC)在IA-32架构的Pentium 处理器.The local APIC 执行以下两个主要的功能:

   . 它接收来自处理器的interrupt pins产生的中断,以及内部的中断源和外部I/O APIC产生的中断,并送往处理器核心来处理。

   . 在多处理器系统中,它发送inter processor interrupt(IPI)信息到系统总线上其他logical processors,并接收来自系统总线上其它 logical processors 的IPI message。IPI messages 能够被用来在系统中的各个处理器间分配中断或用来执行系统各种各样的功能。(例如,bootingup processors 或在处理器间分配工作)。

    The External I/O APIC是系统芯片组的一部分。它的主要功能是接收来自系统和与它相关I/O设备产生的外部中断事件,然后传递它们到 local APIC作为中断信息。在MP系统中,I/O APIC 也提供了一种机制来分配外部中断到the local APICs of selected processors 或者groups of processors on the system bus.

     LOCAL AND I/O APIC OVERVIEW

     每一个 local APIC 由一系列的APIC寄存器组成,以及相关的硬件控制传递处理器核心的中断和IPI信息APIC registers 是内存映射的,可以通过使用MOV指令读和写

     local APICS 能够接收来自下面的中断源:

     . Locally connected I/O devices - 这些中断通过一个直连到processor's local interrupt pins(LINT0 和LINT1)的I/O 设备以边沿触发或电平触发有效产生。the I/O devices也可以连接到8259类型的中断控制器(那是通过其中的一个local interrupt pin依次连接到处理器的)。

     . 外部连接的I/O devices - 这些中断通过连接到一个 I/O APIC的中断输入PIN 的I/O device以下降沿和电平触发有效产生。中断被作为 I/O interrupt messages从 I/O APIC 传送到系统中的一个或多个处理器。

     . Inter-processor interrupts(IPIS) - IPI机制被一个Intel64或IA-32的处理器使用来中断另一个处理器或在系统总线上的一组处理器。IPIs被用来software self-interrupts, interruptforwarding ,or Preemptive scheduling。

     . ACPI timer generated interrupts - 当被编程的数目计数(定时)到了,The local APIC timer 能够被编程来发送一个local interrupt 到它关联的处理器。

     . Performance monitoring counter interrupts - P6 family, Pentium4,和Intel Xeon 提供the abitily 来发送中断到它关联的处理器当performance-monitoring 计数器溢出。

     . Thermal Sensor interrupt - Pentium 4 和Intel Xeon processors提供the Ability来发送中断给他们自己当内部的热传感器被触发。

     . APIC internal error interrupts -  当一个错误的状态在the local APIC 中被识别(例如存取未被实现的处理器),the APIC 能够被编程用来发送一个中断到他关联的处理器。

     这些中断源: the processor's LINT0和LINT1pin,the APIC timer, the performance-monitoring counters, the thermal sensor, 以及内部的APIC error  detector 都被当作local interrupt sources. 一旦接收到一个来自local interrupt sources的信号,the local APIC 使用一个中断传递协议(被叫做local vector table或LVT的一组APIC寄存器设置好)将中断传递到处理器核心。在中断向量表中一个独立的入口被提供给每一个local interrupt 源,这样允许一个专门的中断传递协议能够被设置给每一个中断源。例如,如果the LINT1 pin 被用来当作一个NMI pin,中断向量表中LINT1入口能够被设置来传递一个中断with number 2(就是NMI中断)给处理器核心。

     The local APIC 通过自己的IPI 信息处理设施来处理其它两类中断源(外部连接的I/O设备和IPIS)的中断。

     一个处理器通过编程在它local APIC中的中断命令寄存器(ICR)来产生IPIS。写ICR的行为会引起系统总线或APIC 总线上产生IPI message。IPIS能被送到系统中其他的处理器或起始的处理器(self-interrupts).当目标处理器接收到了一IPI信息,它的localAPIC 会自动地处理这信息。

     The local APIC 也能够接收来自外部连接到I/O APIC设备的中断。The I/O APIC负责接收系统硬件和I/O 设备产生的中断,并传送给the local APIC 作为中断信息。

     The I/O APIC 上的个别 PINS 宣称有效时,能够被编程来产生一个专门的中断向量.The I/O APIC 也有 a “virtual wire  mode”,这允许它和一个标准的8259A类型的外部中断控制器通信。注意the local APIC 能够被关掉,这允许一个相关的处理器核心直接从一个8259A中断控制器接收中断。

     Local APIC和I/O APIC 都被设计在MP系统中操作。每一个local APIC 处理来自I/O APIC的中断,来自系统总线上处理器的IPIS,以及自我产生的中断。中断也能被传递给个别的处理器 通过local interrupt pins;然而这种机制一般不在MP系统中使用。


     The IPI机制被典型的用在MP系统中来发送固定的中断(指定专门向量号的中断)和系统总线上给处理器的特别用途的中断。例如,a local APIC 能够使用一个IPI来转发一个固定的中断给另一个处理器来服务。专门目的的IPIS(包括NMI,INIT,SMI和SIPI IPIS)允许系统总线上的一个或多个处理器来执行系统各种各样的boot-up和控制功能。

     SYSTEM BUS VS. APIC BUS

     对于P6 family 和 Pentium 处理器,the I/O APIC和 local APICs通过the 3-wire inter-APIC 总线来通信(see figure 10-3).Local APICs 也使用APIC 总线来发送和接收IPIs。The APIC 总线和它的信息对软件不可见,并且没被分类为架构。

     从Pentium 4和Intel Xeon处理器起,the I/O APICs和local APICs(使用xAPIC架构)通过系统总线通信。The I/O APIC发送中断请求给系统总线上的处理器通过INTEL芯片组的桥硬件部分。The bridge hardware 产生给local APICs的中断信息。Local APICs之间的IPIs被直接在系统总线上传输。

             

     


 

 

 


 

 

 

     

 

 

 

 

 

 

 

 

### x86 SMP系统中APIC和ACPI的实现原理与配置方法 #### 1. APIC在x86 SMP系统中的实现 在x86架构的SMP系统中,高级可编程中断控制器(APIC)是实现多处理器环境中中断管理和任务调度的核心组件。APIC分为本地APICLocal APIC)和I/O APIC两部分[^4]。本地APIC集成在每个CPU中,负责处理与该CPU相关的中断请求;而I/O APIC则位于外部设备与总线之间,用于将外部中断分发到适当的CPU。 APIC通过中断向量表来管理不同类型的中断,并支持多种中断模式,包括固定模式、最低优先级模式和SMP特定的中断目标模式等。例如,在SMP系统中,操作系统可以通过写入APIC寄存器,将一个中断定向到特定的CPU或一组CPU。这种灵活性极大地提高了系统的并发性能和资源利用率。 以下是设置APIC中断的一个简单代码示例: ```c void set_apic_irq(int irq, int cpu_id) { // 设置目标CPU lapic_write(LAPIC_DEST_FIELD, cpu_id); // 设置中断向量 lapic_write(LAPIC_LVT_LINT0, irq | LAPIC_DM_FIXED); } ``` #### 2. ACPI在x86 SMP系统中的作用 高级配置与电源接口(ACPI)为x86架构提供了统一的标准接口,用于描述硬件配置信息、电源管理和热插拔功能等。在SMP系统中,ACPI扮演了关键角色,它通过一系列表格(如MADT、FADT等)向操作系统提供详细的CPU拓扑结构和相关参数。 - **MADT(Multiple APIC Table)**:描述了系统中所有APIC的配置信息,包括本地APIC的ID、版本号以及I/O APIC的基地址等。 - **FADT(Fixed ACPI Description Table)**:定义了基本的ACPI功能,如唤醒向量、PM1a事件块地址等。 通过解析这些表格,操作系统可以准确地识别系统中的CPU数量、类型及其互联关系,从而优化任务调度和资源分配策略。 #### 3. 配置方法 在Linux内核中,SMP系统的初始化过程涉及对APIC和ACPI的支持配置。以下是一个典型的内核编译选项配置示例: ```bash CONFIG_SMP=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y CONFIG_ACPI=y ``` 此外,在启动时,可以通过传递内核参数进一步调整SMP行为。例如,限制可用的CPU数量以进行调试或性能测试: ```bash sudo ./qemu-system-x86_64 --enable-kvm -kernel ../../linux/linux-5.4.240/arch/x86/boot/bzImage -initrd ./../../busybox-1.35.0/initramfs.cpio.gz --append "init=/init nr_cpus=4" ``` #### 4. 实现细节 APIC和ACPI的具体实现细节包括以下几个方面: - **中断路由**:通过配置MADT中的中断源覆盖项,可以自定义中断从I/O设备到目标CPU的映射关系。 - **热插拔支持**:ACPI允许动态添加或移除CPU,这需要操作系统能够实时更新其内部数据结构以反映新的硬件状态。 - **电源管理**:利用C-state和P-state机制,ACPI可以帮助降低SMP系统的功耗,同时保持高性能水平。 ### 示例代码:读取MADT表 以下代码展示了如何在Linux内核中读取并解析MADT表: ```c struct acpi_table_madt *madt; if (acpi_get_table(ACPI_SIG_MADT, 0, (struct acpi_table_header **)&madt)) { pr_err("Failed to get MADT table\n"); return -ENODEV; } for (entry = (u8 *)madt->entries; entry < (u8 *)madt + madt->header.length; ) { switch (entry->type) { case ACPI_MADT_TYPE_LOCAL_APIC: pr_info("Found Local APIC: ID=%d\n", ((struct acpi_madt_local_apic *)entry)->id); break; case ACPI_MADT_TYPE_IO_APIC: pr_info("Found I/O APIC: ID=%d\n", ((struct acpi_madt_io_apic *)entry)->id); break; } entry += entry->length; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值