使用CPUID指令来探测一个物理处理器中是否存在硬件多线程的支持。硬件多线程可以支持多级以及/或Intel超线程技术几个品种。CPUID指令提供了若干套参数信息以辅助软件枚举拓扑信息。由CPUID所提供的相关拓扑枚举参数包括:
1、硬件多线程特征标志 (CPUID.1:EDX[28] = 1)——当置1时指示,物理包能够支持Intel超线程技术以及/或多核。
2、为8比特APIC ID的处理器拓扑枚举参数:
为在同一包中的逻辑处理器的可编址ID(CPUID.1:EBX[23:16])——指示在一个物理包中的逻辑处理器的最大数量可编址ID。在一个物理包内,可能有没被任何逻辑处理器占用的可编址ID。此参数并不表示物理处理器的硬件性能。
3、在同一物理包中的处理器核心的可编址ID(CPUID.(EAX=4, ECX=07):EAX[31:26] + 1 = Y)——指示在物理包中可作为处理器核心属性的最大数量的可编址ID(Y)。
4、为32位APIC ID的扩展处理器拓扑枚举参数:支持CPUID分枝0BH的Intel 64处理器将唯一的APIC ID赋给系统中的每个逻辑处理器。CPUID分枝0BH报告32位APIC ID并提供拓扑枚举参数。见CPUID指令参考页in Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2A。
CPUID特征标志可以指示对硬件多线程的支持,当只有在包中一个逻辑处理器可用时。在这个情况下,由EBX寄存器中的16到23比特所表示的十进制值将有一个值1。
软件应该注意,由系统软件所允许的逻辑处理器的个数可能小于“为逻辑处理器可编址ID”的值。类似地,由系统软件所允许的核心的数量可以小于等于“为处理器核心的可编址的ID”的值。
软件可以探测CPUID扩展拓扑枚举分枝(0BH)的能力,通过执行两个步骤:
1、通过执行CPUID,让EAX = 0,来检查基本CPUID信息的最大输入值。如果CPUID.0H:EAX大于等于11(0BH),那么处理下一步。
2、检查CPUID.EAX=0BH, ECX=0H:EBX为非0。
如果上述条件都为真,扩展拓扑枚举分枝可用。注意,在一个处理器中CPUID分枝0BH的存在不能保证支持本地APIC支持x2APIC。如果CPUID.(EAX=0BH, ECX=0H):EBX返回0,并且基本CPUID信息的最大输入值大于0BH,那么CPUID.0BH分枝在那个处理器上不被支持。
8.6.1 初始化支持Intel超线程技术的处理器
为包含支持Intel超线程技术的处理器的MP系统的初始化过程与为传统的MP系统一样(见8.4小节)。系统中的一个逻辑处理器被选为BSP,而其它处理器(或逻辑处理器)被指派为AP。初始化过程与在8.4.3小节,8.4.4小节中描述的相同。
在初始化期间,每个逻辑处理器被赋予一个APIC ID,此ID为每个逻辑处理器而被存放在本地APIC ID寄存器中。如果存在两个或更多支持Intel超线程技术的处理器,那么在系统总线上的每个逻辑处理器被赋予一个唯一的ID(见8.9.3小节)。一旦,逻辑处理器(译者注:复数)有了APIC ID,软件通过发送APIC IPI消息与它们通信。
8.6.2 初始化多核处理器
为包含多核Intel 64或IA-32处理器的一个MP系统的初始化过程,与为传统的MP系统一样(见8.4小节)。在一个核心中的一个逻辑处理器被选作为BSP;其它逻辑处理器被指派为AP。
在初始化期间,每个逻辑处理器被赋予一个APIC ID。一旦逻辑处理器有APIC ID,那么软件可以通过发送APIC IPI消息与它们通信。
8.6.3 在一个支持硬件多线程的Intel® 64或IA-32处理器上执行多线程
在完成操作系统引导过程之后,引导序列处理器(BSP)执行操作系统代码。其它逻辑处理器被放置在暂停状态。为了要在一个已被暂停的逻辑处理器上执行一条代码流(线程),操作系统发布一个进程间中断(IPI),寻址到暂停的逻辑处理器。为了响应IPI,处理器被唤醒,并且开始执行由所接受到的作为IPI一部分的中断向量所标识的线程。
为了管理逻辑处理器上多线程的执行,一个操作系统可以使用传统的对称多处理器(SMP)技术。比如,操作系统可以使用一个时间片或负载平衡机制来周期性地中断每个活动的逻辑处理器。在中断一个逻辑处理器时,操作系统为一个等待要被执行的线程检查其运行队列,然后将它分派到被打断的逻辑处理器。
8.6.4 在一个支持硬件多线程的IA-32处理器上处理中断
在支持Intel超线程技术的处理器上对中断的处理与传统MP系统上对中断的处理一样。外部中断通过I/O APIC被接受,I/O APIC将外部中断作为中断消息,派发给指定的逻辑处理器(见图8-3)。
逻辑处理器也可以将IPI(译者注:复数)发送给其它逻辑处理器,通过对目标逻辑处理器的本地APIC的ICR寄存器进行写(见10.6小节)。这也应用于双核处理器。