全部博文(44)
分类:
2010-03-08 11:12:50
发出的中断消息是如何找到LAPIC的?
上面两个流程的第一步都是确定是否由自己接收中断。前面我们提到,RTE中的Destination Field用于指定由哪个APIC接收,并且分为Physical和Logical两种模式。对于LAPIC,两种模式有着不同的意义。
Physical模式:在该模式下,RTE中的Destination Field表示的是LAPIC ID。对于LAPIC来说,系统在RESET后,都会分配一个唯一的ID用作标识。在X86平台下,我们可以通过LAPIC ID寄存器得到它。图1-6为其格式:
图1-6 Local APIC ID 操作系统或BIOS,通常会使用LAPIC ID唯一的标识一个CPU。在Pentium系列和P6架构中,由于APIC BUS最多只支持15个LAPIC ID,即一个MP平台最多只能有15个CPU,RTE中的destination field表示LAPIC ID时只用了4bit,LAPIC ID寄存器也只有4bit可用。对于Pentium4和Xeon系列,APIC ID被扩展至8bit,最多支持255个LAPIC。系统RESET后,可以用CPUID指令(EAX写参数1,EBX的24~31即为返回的ID)获得默认的LAPIC ID。某些CPU允许软件更改默认的ID号,但通常来说,软件应该避免这样的行为。无论何时,CPUID指令返回的都是系统RESET后默认分配的LAPIC ID,即使当前的LAPIC ID寄存器已经被软件更改过。 关于APIC ID APIC ID分为LAPIC ID和IOAPIC ID。前者唯一的标识系统中某个LAPIC,后者唯一标识某个IOAPIC。LAPIC ID前面已经介绍了,根据MP spec(Multiple Processor Specification,多处理器规范)规定,LAPIC ID必须唯一,但可以不连续。与LAPIC ID不同,IOAPIC ID在系统RESET后统一清零,操作系统或BIOS负责验证IOAPIC ID是否唯一,如果有冲突检测到,由操作系统或BIOS重新分配。重分配的原则是从系统中所有LAPIC ID后最小的数字开始分配。例如当前系统有两个LAPIC,ID为0、1,则分配IOAPIC ID应该从2开始。 需要注意的是,MP spec对APIC ID的分配规则只适用于系统用APIC BUS的情况。X86 spec说4bit的LAPIC ID可以表示15个CPU,还有一个0x0f预留给了广播。当RTE的destination field字段代表APIC ID,且值为0x0f时,该中断消息广播给所有CPU。 笔者:LAPIC ID是从0开始分配的,IOAPIC ID在系统RESET后自动清0。MP spec说“操作系统在探测到IOAPIC ID冲突时,有义务为它分配一个新的ID”。那相同的LAPIC ID和IOAPIC ID算不算冲突呢?算,但是对于Pentium4和Xeon系列使用前端总线通讯的系统,”It’s not an issue”。在此种系统中,LAPIC是要用ID参与前端总线竞争的,IOAPIC却不用,因为是北桥代理它竞争总线。IOAPIC ID只用于区分多个IOAPIC,它和LAPIC ID不在一个上下文。 APIC BUS下,IOAPIC ID要用于竞争总线,不能和LAPIC ID冲突,分配规则“题外话”中已说明。 当中断消息通过Physical模式发送时,LAPIC通过LAPIC ID来判断该中断是否由自己接收。 Logical模式:在该模式下,中断消息中的Destination Field包含的不是LAPIC ID,而是被称为MDA(Message Destination Address,消息目的地地址)的信息。此时,LAPIC需要两个额外的寄存器来判断自己是否为中断消息的目的地。它们是LDR和DFR。 LDR的格式如图1-7所示: 图1-7 LDR格式 LDR全称是Logical Destination Register,逻辑目的地寄存器。该寄存器包含一个8bit的逻辑APIC ID(注意区分,它和LAPIC ID不是一个东西),在Logical模式下用于和MDA匹配。LDR的格式由DFR指定,DFR如图8所示: 图1-8 DFR格式 DFR,Destination Format Register,目的地格式寄存器。该寄存器包含一个4bit的mode字段,用于指定LDR中的Logical APIC ID用何种方式与MDA匹配。通过这两个寄存器的配合,Logical模式又被分为了Flat与Cluster两种模式。 u Flat模式:DFR的model值为1111b,此时,LAPIC将MDA与LDR的logical APIC ID做位与,如结果不为0则接收中断。Logical APIC ID中每个bit代表一个LAPIC,故8bit最多代表8个CPU。 u Cluster模式:DFR的model值为0000b。我不得不说我可能会把你搞晕了,但实际上确实如此,x86太TMD复杂了。Cluster模式又分为两种模式:Flat Cluster模式和Hierarchical Cluster模式。 l Flat Cluster模式:该模式只支持P6架构和Pentium系列CPU,并假定所有APIC通过APIC BUS通讯。该模式将MDA编码为两个部分,高4bit为簇号,低4bit标识LAPIC在该簇内的ID(每个bit代表一个LAPIC,故一个簇最多有4个LAPIC)。与之对应,LDR的logical APIC ID也被编码成同样两个部分。 工作在该模式时,LAPIC先将MDA的高4bit和Logical APIC ID的高4bit比较,以确定自己是否是中断的目的簇。若是,将MDA的低4bit与Logical APIC ID的低4bit位与,若值不为0则接收中断。否则拒绝。 通过这种方法,高4bit的簇号可以表示15个簇,低4bit的ID可以代表簇内的4个CPU,最多可以支持60个CPU。但由于APIC BUS的限制,具体的说是APIC Arb ID(APIC仲裁ID)的限制,该模式最多只支持15个CPU。 l Hierarchical Cluster模式:支持P6架构和Pentium系列,以及Xeon、Pentium4系列。该模式通过为每个簇引入一个“簇管理器”,将Flat Cluster模式中平等的簇构成一个具有等级结构的分级网络,并最多支持60个CPU。这个话题太远了,相关spec没有更多资料,就不多做介绍了。 笔者:不要问我Hierarchical Cluster模式下,P6架构和Pentium系列如何突破APIC BUS对于15个CPU的限制的,我真的不知道。 “通过这种方法,高4bit的簇号可以表示15个簇”,实际上应该是0~15共16个簇,但MDA全1时为广播到所有LAPIC,笔者认为簇号1111b被预留给广播模式了。 对于Flat Cluster模式,我们举个例子吧(此例中,中断为Fix delivery mode。关于Lowest Prority的例子见后面内容)。假设有三个CPU的logical模式配置为(此时DFR的model值为0000b):CPU1的LDR值为0000 0001b,CPU2的LDR值为0001 0010b,CPU3的LDR值为0000 0100b,则CPU1、CPU3为一簇,CPU2为另一簇。IOAPIC发出一条中断消息,其Destination Mode为1,destination field值为0000 00001b。三个LAPIC收到该消息后,CPU1、CPU3通过destination field的高4bit判断出该消息目的地为本簇,再将自身Logical APIC ID的低4bit与destination field低4bit位与,最终CPU1接收该中断消息,CPU2、CPU3丢弃。 图1-9总结了中断消息的Destination Field字段用于寻址LAPIC的几种模式:
图1-9 Destination Field模式