" title="朱增举 IT博客


0

RTC BUG

编辑:管理员/ 栏目:Windows系统类 /发布于:2021年-1月-5日

【背景知识】

ACPI计时器(ACPI Timer):也叫PM计时器,是一种外部硬件计时器,固定频率3.579545MHz。

HPET计时器(HPET Timer):高精度事件计时器,也是外部硬件计时器,固定频率14.31818MHz。

RTC计时器(RTC Timer):实时时钟计时器,是软件计时器,需要读取硬件计时器来计算。它是Windows和据大多数软件衡量时间的参考时钟。

TSC计时器(TSC Timer):时间戳计数计时器,是基于硬件的计时器,但频率可变。以前它就等于处理器频率,在早些年不是问题,但后来处理器不断加入会降低频率的扩展频谱、电源管理等功能,就有问题了,于是后来设计的时候将其改为和处理器频率相独立。

QPC计时器(QPC Timer):查询性能计数计数器,是一个可访问高分辨率计时器的原生Windows API,用来计算已流逝时间。换言之,它也是读取硬件计时器的软件计时器。它最初使用TSC计时器,但后来改成了使用ACPI、HPET之类的固定频率计时器。

DMI频率:也叫总线频率,Intel平台上的BCLK,AMD平台的HTT,俗称外频。也是固定的频率,但是可以在BIOS、Windows里自行更改。【Intel Windows 8平台实测】

不改变总线频率,所有计时器都表现正常,给出了各自的频率和时间。

在Windows 8系统中,将总线频率从100MHz降至95MHz,ACPI、HEPT计时器不变,但是RTC、QPC计时器都不正常了。

接下来在BIOS里将总线频率改为95MHz并启动,所有计时器的时间都是正常的,但是注意QPC计时器的频率从3.42MHz降低到了3.25MHz,简单计算可知其变化幅度就是总线频率的5%。

这不但证明RTC计时器的变化仅仅是在Windows里改变频率才受影响,也说明QPC计时器是以DMI频率为计时源的。

在转向AMD平台之前,我们不妨猜测:

1、RTC、QPC计时器使用相同的硬件源(计时器或者频率)。

2、硬件源对总线频率的变化很敏感。换言之,Windows 8则似乎使用的是内部硬件计时器或者直接用DMI频率,而不是用外部计时器。

【AMD Windows 8平台实测】

重启系统,进入Windows 8后使用超频工具将总线频率从200MHz降至180MHz,RTC、QPC计时器时间不变,但是QPC计时器的频率又变了,现在是和HPET计时器相同的14.32MHz。稍后再对此进行分析。

接下来还是进入BIOS改变频率,所有时间、频率正常。

刚才我们看到了,QPC计时器在总线频率变化后改以HPET计时器为源,那么如果在BIOS里禁用HPET计时器会如何呢?QPC计时器就把计时源改成了ACPI计时器。

重新启用HPET计时器,QPC计时器的频率又恢复到了14.32MHz。

目前可以得出的结论:

1、刚刚装好的AMD Windows 8系统中,QPC计时器和Intel平台上一样,但是重启后就使用HPET或者ACPI计时器作为计时源。

2、默认情况下,AMD Windows 8系统的QPC计时器使用HPET作为计时源,HPET不可用则转向ACPI。

3、AMD平台没有Windows 8 RTC Bug。

但还有个小疑问:RTC、QPC计时器使用相同的硬件计时源么?

【Windows 8安装在AMD上但测试在Intel上进行】

这个小标题是不是有些拗口?其实很简单,拿下安装了Windows 8系统的AMD平台硬盘,装入Intel平台,看看会发生什么。 


很有趣,QPC计时器的频率也是14.32MHz,计时源显然是HPET。AMD治好了Intel?

别急。我们打开Windows启动菜单文件bcdedit,可以发现里边有个参数存在于AMD平台,Intel平台上却没有,那就是“useplatformclock”(使用平台时钟),默认值为Yes。我们把它改成No。


RTC Bug回来了!QPC计时器的频率又和DMI频率一致了。真相越来越近了。

当前结论:

1、useplatformclock参数似乎是个关键,它在AMD平台上取值Yes,Intel平台上却没有,或者说相当于No。

2、Intel平台上手动添加useplatformclock参数并设为Yes,可以修复RTC Bug。

3、删除useplatformclock参数,或者改成No,RTC Bug就会重现。

【AMD平台真的无虞么?】

经过更进一步的研究,发现AMD平台同样可以出现RTC Bug,看:


很简单,只要以管理员身份打开CMD,在命令行窗口输入:

bcdedit /set {current} useplatformclock No

或者

bcdedit /deletevalue {current} useplatformclock

也就是手动删除useplatformclock参数,但是这仅在下次启动后有效,因为再次启动的时候Windows 8会自动重新添加这一参数并设置为Yes,相当于某种自动恢复,但是仅限AMD平台。

【Windows 7又如何?】

接下来在Intel平台上安装Windows 7,启动文件里同样没有那个参数。


很显然:

1、Windows 7系统里,QPC计时器默认源是DMI频率,和总线频率息息相关。

2、RTC计时器此时和QPC计时器的源不同。

3、RTC计时器和总线频率无关,意味着它使用的是HPET、ACPI这种外部计时器。

那么加入useplatformclock参数并设为Yes又如何呢?


QPC计时器改为以HEPT为源,不受总线频率变化影响。

【最终结论】

1、Windows 8下的测试成绩的确无法完全信任,因为它用的RTC计时器很容易被欺骗。

2、AMD其实也能受到影响,但是需要手动修改才行,默认情况下没问题。

3、Windows 7没有这个问题,除非有人知道如何让RTC计时器使用和QPC相同的源。

4、Windows 8的确是问题的根本:RTC计时器被设置为和QPC使用相同的计时源,但是在Intel平台上缺乏启动参数,结果未能使用外部硬件计时器作为源,而是调用DMI频率,就出现了Bug。

5、解决方法很简单:Intel平台上运行如下命令:bcdedit /set {current} useplatformclock Yes

不过即使是你在Intel平台上进行修改、消除RTC Bug、除非微软哪天对此高度关注并打上补丁,超频玩家们还是继续用Windows 7好了

本文由“朱增举 IT博客 > 管理员”整理编辑。


未注明为原创的文章以及每篇文章的评论内容都不代表本站观点,本站不对此内容的真实性及言论负责。如您发表评论意见,视为同意本站记录言论您的来源IP地址信息及发表时间。

如果喜欢这篇文章,欢迎订阅朱增举 IT博客以获得最新内容。

已经有 0 条群众意见