在当今的计算世界,获取处理器的详细信息变得异常简单,这主要归功于CPUID指令的引入。在1993年,Intel首次推出Pentium和SL增强型486处理器时,这一功能应运而生,使程序员能够轻松查询处理器类型及其支持的特性,如MMX和SSE等。在CPUID指令普及之前,程序设计者使用一些独特的方法来识别处理器的类型,这在当时是一场技术上的探险。
在CPUID推出之前,程序员依赖于一些被视为秘而不宣的机器码来发掘CPU行为中的微小差异。
随着80386处理器的推出,处理器在重启时透过EDX寄存器来指示其版本。但是,这一信息只有在重启后才能得到,而当时并没有标准方法供应用程序直接读取这一值。这意味着程序设计者不得不使用各种不寻常的手段来识别不同的CPU。举例来说,Motorola的680x0系列处理器就从未拥有任何CPUID指令。开发者必须使用一些特定的指令来判断处理器的类型,这些指令需要特权执行。在这样的背景下,68010处理器将MOVE指令从状态寄存器标记为特权,这使其能够符合虚拟化需求。
CPUID指令的出现,不仅为x86架构的程序员提供了便利,还对其他架构的设计如ARM也有影响,这些架构通常提供与CPUID相似的寄存器,用以获得处理器的基本资讯。
CPUID中的操作代码为0F A2。通常在组合语言中,CPUID指令不需要参数,因为它隐含使用EAX寄存器来决定返回信息的主要类别。这个呼叫被称为CPUID的“叶子”。根据Intel的术语,第一个调用CPUID时,EAX应设为0,以获取CPU可支援的最高功能参数。
若要获取扩展功能信息,则应将CPUID呼叫的EAX的最高位设置为1。
随着通用计算的发展,目前有许多基于CPUID取得的基本叶子的有效范围已达到23h。根据CPUID的调用,可获得多种信息,如制造商ID以及各种处理器特性的支持情况。在许多情况下,返回的信息在公开文档中未被披露,因此开发者需要依赖经验和文献来探索处理器的秘密。
当EAX设置为0时,CPU返回其制造商ID字符串—一个12字符的ASCII字符串,并依序存储在EBX、EDX和ECX寄存器中。根据最新资料,标准的处理器制造商ID如下:
通过将EAX设置为1,可以获得处理器的步进、型号和系列信息,这些信息对于判断各个型号的性能至关重要。这代表着处理器标识,并在EAX、EDX和ECX寄存器中返回功能标志和附加特性信息。
所有的处理器信息都是制造商特定的,但大多数情况下,Intel的值被其他厂商用于兼容性。
这种方式的出现使得开发者能够清楚获知处理器的物理层面,随着时间的推移,这项技术越来越被广泛应用,从而推动了整个计算技术的进步。此外,这也促进了多核心处理器的设计,促使后续的处理器架构不断演进。
随着处理器技术的不断发展,CPUID指令的影响力愈加明显,为各种程序和系统提供了重要的硬体信息。然而,随着未来技术的深化,我们不禁要思考:随着硬体的快速变化,未来的程序设计将如何能够更智能地理解这些硬体特性和优化其性能呢?