|
发表于 2008-4-30 11:51:08
|
显示全部楼层
关于1A0(IA32_MISC_ENABLE)以及199(IA32_PERF_CTL),198(IA32_PERF_STATUS),自己project的CPU一定有Spec可以看到的,如果没有就向Intel的FAE要吧。
' d/ a& b# z; o1 d) K5 UIA-32 ASDM volume 3也提到一点点,特别是1A0(IA32_MISC_ENABLE).- s! N2 F# q+ X7 j
0 u! ~2 L; R; R7 y. \4 b对于Intel speedstep,我这里摘抄一篇深圳顶星数码的同志所发表一篇绝好的技术简介文档给你做参考。
2 M( e' q# O$ @0 ~# R( F: C/ M
. `( { K' ^7 |# z" q: g4 T( n' R5 C L! o7 E. h# H
对于英特尔的SpeedStep节能技术,很多人可能已不再陌生。SpeedStep技术是一项旨在彻底区分台式机CPU与笔记本电脑专用CPU的性能,并与系统运行速度有密切关系的新技术,原来的代号是“Geyserville”。简单地说,采用SpeedStep技术的笔记本电脑,可以根据不同的使用环境,对CPU的运行速度进行合理调整。SpeedStep技术的基本工作过程是:如果笔记本电脑使用的是外接电源,CPU将按照正常的主频率及电压运行;当专用软件检测到笔记本电脑切换到电池电源供电时,将自动切换笔记本电脑CPU的主频率及电压至较低运行状态;当笔记本电脑恢复使用外接电源时,CPU又自动切换回到最高主频率及正常电压下工作,使之全速运行。从技术上分析可知,同一处理器工作时,运行速度越快,工作电压越高,功耗也越大;相反,处理器的运行速度降低后,工作电压会降低,功耗和发热量也会降低。
% H4 D0 d6 p2 O' S/ C3 t
3 Z) T& n# w* v* J9 I0 J在去年(2003年),英特尔又推出了内部代号为“Geyserville III”的增强SpeedStep技术,首先在Pentium M处理器实现,支持的平台包括Odem和Motora等855系列芯片组。其与原有的SpeedStep主要有两点区别:第一点,增强的SpeedStep(简称EIST)使得原有的性能等级从两阶增加到多阶,是的性能切换更加灵活,例如,1.4G Pentium 4M的有600M和1.4G两档,但是对于支持1.4G Pentium M处理器而言,就有600M、800M、1G、1.2G和1.4G五个频率档次。第二点,增强的SpeedStep可以直接通过对处理器的MSR寄存器编程来实现频率,大大减少了频率切换时间,而原来的SpeedStep依赖于对Chipset的IO端口编程实现,所以切换延时较大。
) Q3 T8 {* ^) t9 x; j+ d- u9 e9 Y3 a3 R- W. s6 L9 @* S
下面我们简单介绍一下对于SpeedStep的支持固件编程相关知识。
! C e4 i6 {; T; P H! `
. _, ?: A/ {: b/ ~ 我们知道,处理器的性能状态是由离散的电压和频率对定义的。在不同的频率和电压下,处理器的执行性能也是不同。EIST提供了一个全新的方法来改变CPU的性能状态,这种方法本身是基于CPU MSR寄存器,而不是基于Chipset的,所以这种方法具有硬件软件的转变过渡时间少、系统设计简单等特点。Intel的奔腾M处理器提供了两个MSR寄存器来实现EIST功能,一个是IA32_PERF_CTL和IA32_PERF_STS,我们通过写IA32_PERF_CTL来实现CPU性能的状态转变,主要是设置BUS_RATIO_SEL和VID_SEL位域。一旦设置完之后,CPU随后马上进行RATIO和VID的切换,如果在切换的过程中间有新的值更新IA32_PERF_CTL寄存器,那么,在CPU完成系统状态切换之后,CPU马上进行本次新的性能切换。 1 ?# v( S; i. j' ~9 _* U" a( U' }
! a& x2 @9 k* s0 c, ?! L 如果我们读取IA32_PERF_CTL,这只表明上次更新所期望的CPU性能置,并不表示CPU的当前性能值,因为,如果CPU处在thermal throttle的过程中,那么,CPU会暂停性能的切换,直到thermal throttle的结束。
" M/ }8 [* _( i- c5 l* k8 m
( m2 F; Y' p% I% |5 t 如果我们想确定CPU的当前性能状态,我们可以通过读取IA32_PERF_STS寄存器的值来确定。这个寄存器包括一些主要信息,如BUS_RATIO_STS和VID_STS域表明当前的频率和电压值,这些信息是动态更新的。这个寄存器同样也包括了系统BOOT时和系统所支持的最大性能点。 ( a+ \5 \% k4 a, m
; p6 l' [3 w+ s- [ L, S 在Windows XP下,OS查找PSS表,找出其想进入的状态,查找控制值,然后把控制值写入控制寄存器中间。系统有两种方式进入实现控制动作,一种是透过SMM模式进行,一种是OSPM通过G3寄存器直接写。到底是采用哪种方式依靠_PCT这个对象决定。而在_PCT内部,实际上是根据系统OSPM的性能确定返回哪种控制方式的,也就是采用SMM Model和Processor Native Mode。
8 X5 A8 w, u) N$ e6 k6 z5 v/ X Y2 L
; l0 x; \& p. s6 p9 G! ` 我们知道,OS是这样实现处理器性能的控制的,首先,OSPM通过ACPI表得知系统支持的处理器状态,然后OSPM根据其对于系统当前状态的评估,确定进入哪种处理器状态。在确定进入何种状态之后,OSPM决定这种方法是否是其支持的方法,否则回去调用CPU的驱动程序完成相关动作。一般OSPM直接支持的方法就是IO之类的传统方法。 & x' B( a5 X+ T! W r& y$ g% _2 R
; D! t7 m) C* H0 s 所以,如果OSPM不是透过SMM去完成对于MSR的IA32_PERF_CTL和IA32_PERF_STS操作,那么,OSPM必须去调用处理器的驱动程序,驱动程序的存在必须告知ACPI,使得ACPI的_PCT的返回是直接对于IA32_PERF_CTL和IA32_PERF_STS操作,而这是依赖于_PDC这个方法完成的,_PDC是OSPM用来告诉ACPI其是否支持直接对于IA32_PERF_CTL和IA32_PERF_STS操作,是OSPM向ACPI传递消息的一种途径。
: K: h. S @$ F+ \& ~
6 p8 |0 a/ W2 \4 v$ P" `! |' @ _FDC是OSPM在进行所有处理器操作之前首先调用的一个方法,这个方法有处理器的驱动程序向ACPI传送一个DWORD的变量,这个变量包含由处理器厂商定义的格式,对于不同处理器的能力。根据_FDC传递过来系统软件支持的能力,ACPI调整_PCT和PSS方法。
& ~+ r# Q. y" G3 a S
2 [( V7 |9 p1 N5 H! o$ U 支持Intel EIST的_FDC的工作原理是这样的,缺省的,系统BIOS是采用IO地址映射的方式提供_PCT和_PSS的,也就是SMM方式操作CPU的MSR寄存器直接对IA32_PERF_CTL和IA32_PERF_STS操作。如果没有处理器驱动程序去调用_PDC这样,通过系统ACPI、SMI服务例程和处理器的服务程序,我们可以实现EIST所带来的优点,达到性能和节电的兼顾。 |
|