Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 恒定的非不变tsc能否跨cpu状态改变频率?_Assembly_X86 64_Intel_Cpu Architecture_Rdtsc - Fatal编程技术网

Assembly 恒定的非不变tsc能否跨cpu状态改变频率?

Assembly 恒定的非不变tsc能否跨cpu状态改变频率?,assembly,x86-64,intel,cpu-architecture,rdtsc,Assembly,X86 64,Intel,Cpu Architecture,Rdtsc,我曾经使用rdtsc对Linux系统调用进行基准测试,以获得系统调用前后的计数器差异。我将结果解释为挂钟计时器,因为TSC以恒定速率递增,并且在进入停止状态时不会停止 不变TSC概念描述为 不变TSC将在所有ACPI p-、C-中以恒定速率运行。和 T型国家 将状态从C0(运行)更改为C1(停止)时,恒定的非不变tsc能否改变频率? 我目前的观点是,它不能只在性能(p)状态之间改变频率。因此,当使用非不变tsc时,应用rdtsc获取系统调用的挂钟计时器是不可靠的 我在我的/proc/cpuinf

我曾经使用rdtsc对Linux系统调用进行基准测试,以获得系统调用前后的计数器差异。我将结果解释为挂钟计时器,因为TSC以恒定速率递增,并且在进入停止状态时不会停止

不变TSC概念描述为

不变TSC将在所有ACPI p-、C-中以恒定速率运行。和 T型国家

将状态从C0(运行)更改为C1(停止)时,恒定的非不变tsc能否改变频率?

我目前的观点是,它不能只在性能(p)状态之间改变频率。因此,当使用非不变tsc时,应用rdtsc获取系统调用的挂钟计时器是不可靠的

我在我的
/proc/cpuinfo
中没有找到不变的tsc标志,只有
常量\u tsc
意味着不需要不变

造成混淆的原因是《英特尔系统编程手册》中的一句话:

较新处理器中的时间戳计数器可能支持增强, 称为不变TSC


因此,一些芯片(包括我的芯片)具有恒定但非不变的tsc。

从Nehalem和Saltwell开始,所有英特尔处理器都支持不变的tsc,这意味着tsc在p、C和T状态之间以恒定速率递增(但不一定在S状态之间)

从奔腾4系列0F 03型开始,所有英特尔处理器都支持恒定TSC,这意味着TSC在p和T状态之间以恒定速率递增。TSC在HLT状态下继续增加(称为自动停止或C1/自动停止)。TSC在任何其他睡眠状态下都不会增加。这类处理器包括Bonnell

较旧的处理器不支持恒定TSC。TSC在HLT状态下继续增加,但在深度睡眠状态下不增加。在其中一些处理器上,TSC是有缺陷的

从S状态唤醒时,TSC值可能会重新初始化(为某些BIOS相关值)

这里是一个总结。“Y”表示TSC在指定类型的州内以相同的速率继续增加。“N”表示TSC以不同的速率继续增加或停止增加。在一些处理器上,TSC在S3状态和更低状态下递增(称为始终在TSC上)。“不适用”表示不支持TSC

                                  |   T   |   P   |C = HLT|C Other|S <= S3|S Other|
---------------------------------------------------
Nehalem+                          |   Y   |   Y   |   Y   |   Y   |   N   |   N   |
Silvermont Merrifield+Moorefield, |   Y   |   Y   |   Y   |   Y   |   Y   |   N   |
Saltwell Penwell+Cloverview
Other Saltwell+                   |   Y   |   Y   |   Y   |   Y   |   N   |   N   |
KNL+                              |   Y   |   Y   |   Y   |   Y   |   N   |   N   |
P4 90nm+                          |   Y   |   Y   |   Y   |   N   |   N   |   N   |
Enhanced Pentium M+               |   Y   |   Y   |   Y   |   N   |   N   |   N   |
Bonnell                           |   Y   |   Y   |   Y   |   N   |   N   |   N   |
Quark X1000                       |   Y   |   N   |   Y   |   N   |   N   |   N   |
KNC                               |   Y   |   N   |   Y   |   N   |   N   |   N   |
P5+                               |   Y   |   N   |   Y   |   N   |   N   |   N   |
Before P5                         |  N/A  |  N/A  |  N/A  |  N/A  |  N/A  |  N/A  |
Other Quark                       |  N/A  |  N/A  |  N/A  |  N/A  |  N/A  |  N/A  |

最后一个非恒定tsc处理器是什么?你关心史前处理器吗?EOF:嗯,不,我不考虑非代码>康斯坦茨TSC < /代码>。但是拥有
常数并不意味着拥有
不变量。嗯,对于我的处理器,在
/proc/cpuinfo
中有一些与TSC相关的标志:
TSC
constant\u TSC
nonstop\u TSC
TSC\u known\u freq
TSC\u deadline\u timer
TSC\u adjust
。没有“不变”,但可能是“已知频率”?cpuinfo通过将
常量\u TSC
不间断\u TSC
放在一起来表示不变的TSC,您确定不只是有一个较旧的内核吗?所有这些东西只有一个CPUID特性位,但是Linux内核添加了几个不同的名称,因此它可以根据已知的CPU型号执行一些逻辑。我做了一些关于TSC特征位的研究,并把我的发现放在了报告中。但是较旧的内核在/proc/cpuinfo中没有显示不同的名称,例如,在我拥有的旧Core2系统上,只是
constant\u tsc
。尽管它是不间断的,并且在内核之间同步。上次我在Linux内核源代码中编辑我的答案时,我去寻找关于不变TSC和常数TSC的信息。我没有发现Linux会为英特尔CPU设置一个功能标志,而不是另一个。如果我没有弄错的话,不变TSC和常数TSC都是相同的CPUID特征位(这很奇怪,对吧?CPUID中不应该有什么东西表明TSC将在更深的C状态中继续滴答滴答地运行?@PeterCordes只有一个不变TSC位,它是
CPUID.0x8000007.EDX[8]
。是的,没有一点可以区分恒定TSC和非恒定TSC。注意,不变TSC也是常数。