Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370772
  • 博文数量: 44
  • 博客积分: 2060
  • 博客等级: 上尉
  • 技术积分: 528
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-17 20:50
文章分类
文章存档

2011年(1)

2010年(28)

2008年(15)

分类:

2010-03-08 11:12:50

发出的中断消息是如何找到LAPIC的?

上面两个流程的第一步都是确定是否由自己接收中断。前面我们提到,RTE中的Destination Field用于指定由哪个APIC接收,并且分为PhysicalLogical两种模式。对于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最多只支持15LAPIC ID,即一个MP平台最多只能有15CPURTE中的destination field表示LAPIC ID时只用了4bitLAPIC ID寄存器也只有4bit可用。对于Pentium4Xeon系列,APIC ID被扩展至8bit,最多支持255LAPIC。系统RESET后,可以用CPUID指令(EAX写参数1EBX24~31即为返回的ID)获得默认的LAPIC ID。某些CPU允许软件更改默认的ID号,但通常来说,软件应该避免这样的行为。无论何时,CPUID指令返回的都是系统RESET后默认分配的LAPIC ID,即使当前的LAPIC ID寄存器已经被软件更改过。

关于APIC ID

APIC ID分为LAPIC IDIOAPIC ID。前者唯一的标识系统中某个LAPIC,后者唯一标识某个IOAPICLAPIC ID前面已经介绍了,根据MP specMultiple Processor Specification,多处理器规范)规定,LAPIC ID必须唯一,但可以不连续。与LAPIC ID不同,IOAPIC ID在系统RESET后统一清零,操作系统或BIOS负责验证IOAPIC ID是否唯一,如果有冲突检测到,由操作系统或BIOS重新分配。重分配的原则是从系统中所有LAPIC ID后最小的数字开始分配。例如当前系统有两个LAPICID01,则分配IOAPIC ID应该从2开始。

需要注意的是,MP specAPIC ID的分配规则只适用于系统用APIC BUS的情况。X86 spec4bitLAPIC ID可以表示15CPU,还有一个0x0f预留给了广播。当RTEdestination field字段代表APIC ID,且值为0x0f时,该中断消息广播给所有CPU

笔者:LAPIC ID是从0开始分配的,IOAPIC ID在系统RESET后自动清0MP spec操作系统在探测到IOAPIC ID冲突时,有义务为它分配一个新的ID”。那相同的LAPIC IDIOAPIC ID算不算冲突呢?算,但是对于Pentium4Xeon系列使用前端总线通讯的系统,”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,而是被称为MDAMessage Destination Address,消息目的地地址)的信息。此时,LAPIC需要两个额外的寄存器来判断自己是否为中断消息的目的地。它们是LDRDFR

LDR的格式如图1-7所示:

1-7 LDR格式

LDR全称是Logical Destination Register,逻辑目的地寄存器。该寄存器包含一个8bit的逻辑APIC ID(注意区分,它和LAPIC ID不是一个东西),在Logical模式下用于和MDA匹配。LDR的格式由DFR指定,DFR如图8所示:

1-8 DFR格式

DFRDestination Format Register,目的地格式寄存器。该寄存器包含一个4bitmode字段,用于指定LDR中的Logical APIC ID用何种方式与MDA匹配。通过这两个寄存器的配合,Logical模式又被分为了FlatCluster两种模式。

u  Flat模式:DFRmodel值为1111b,此时,LAPICMDALDRlogical APIC ID做位与,如结果不为0则接收中断。Logical APIC ID中每个bit代表一个LAPIC,故8bit最多代表8CPU

u  Cluster模式:DFRmodel值为0000b。我不得不说我可能会把你搞晕了,但实际上确实如此,x86TMD复杂了。Cluster模式又分为两种模式:Flat Cluster模式和Hierarchical Cluster模式。

l  Flat Cluster模式:该模式只支持P6架构和Pentium系列CPU,并假定所有APIC通过APIC BUS通讯。该模式将MDA编码为两个部分,高4bit为簇号,低4bit标识LAPIC在该簇内的ID(每个bit代表一个LAPIC,故一个簇最多有4LAPIC)。与之对应,LDRlogical APIC ID也被编码成同样两个部分。

工作在该模式时,LAPIC先将MDA的高4bitLogical APIC ID的高4bit比较,以确定自己是否是中断的目的簇。若是,将MDA的低4bitLogical APIC ID的低4bit位与,若值不为0则接收中断。否则拒绝。

通过这种方法,高4bit的簇号可以表示15个簇,低4bitID可以代表簇内的4CPU,最多可以支持60CPU。但由于APIC BUS的限制,具体的说是APIC Arb IDAPIC仲裁ID)的限制,该模式最多只支持15CPU

l  Hierarchical Cluster模式:支持P6架构和Pentium系列,以及XeonPentium4系列。该模式通过为每个簇引入一个簇管理器,将Flat Cluster模式中平等的簇构成一个具有等级结构的分级网络,并最多支持60CPU。这个话题太远了,相关spec没有更多资料,就不多做介绍了。

笔者:不要问我Hierarchical Cluster模式下,P6架构和Pentium系列如何突破APIC BUS对于15CPU的限制的,我真的不知道。

    通过这种方法,高4bit的簇号可以表示15个簇,实际上应该是0~1516个簇,但MDA1时为广播到所有LAPIC,笔者认为簇号1111b被预留给广播模式了。

对于Flat Cluster模式,我们举个例子吧(此例中,中断为Fix delivery mode。关于Lowest Prority的例子见后面内容)。假设有三个CPUlogical模式配置为(此时DFRmodel值为0000b):CPU1LDR值为0000 0001bCPU2LDR值为0001 0010bCPU3LDR值为0000 0100b,则CPU1CPU3为一簇,CPU2为另一簇。IOAPIC发出一条中断消息,其Destination Mode1destination field值为0000 00001b。三个LAPIC收到该消息后,CPU1CPU3通过destination field的高4bit判断出该消息目的地为本簇,再将自身Logical APIC ID的低4bitdestination field4bit位与,最终CPU1接收该中断消息,CPU2CPU3丢弃。

1-9总结了中断消息的Destination Field字段用于寻址LAPIC的几种模式:

 

1-9 Destination Field模式

阅读(5204) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~