在x86处理器的时间源(Time sources in x86 processors)

2019-06-27 16:10发布

有谁知道,可用于测量时间的x86指令? 是由软件导致任务切换访问的计时器?

Answer 1:

的方式来衡量时间在x86平台上:

  • 实时时钟 - 时间和日期为您的操作系统的源。 1秒精度。 在可被用于测量绝对时刻的标准PC的唯一时间源。

  • 8254计数器/定时器 -一个标准计数器/定时器芯片由于PC的曙光(现为芯片组内的功能块),其已经存在于主板。 这是IRQ0,定时器中断,做任务切换中最年长的操作系统的传统来源。

  • RDTSC汇编指令 - 计数CPU时钟周期。 一看便知匿名ymous张贴一些使用细节。 相当多的精度的最高水平,你可以找到x86上的时间源。 但是,它也有一些陷阱与准确性。 也是最方便的选择,如果你正在写汇编。

  • RDTSCP汇编指令 - 到RDTSC类似,不过是系列化,从而解决了一些与RDTSC准确性的问题。 只有在最新的处理器中。

  • HPET -介绍各地的个人电脑的酷睿时代。 旨在成为令人尊敬的现代8254操作系统将以此作为自己的任务调度中断替换(Vista和更高版本)

  • 在芯片组专有定时器 - 一些芯片组都有内置的电源管理和多媒体功能专用的定时器。 有时你可以征用这些为自己的应用程序,假设你正在处理一个固定功能的嵌入式系统,而不是一个通用的PC。

请注意,并非所有这些选项将提供您根据您的操作系统和硬件上。 如果你是一个现代操作系统(Windows和Linux)下运行,它会采取8254 / HPET为自己的时间需求的控制,因此,他们会为你不可用。

下现代操作系统,通常最好使用OS提供的定时功能。 操作系统开发者可能已经摸索出了很多,你将在你自己,如果你尝试使用它遇到的各种问题。 (注意,OS可以提供​​多个定时的功能。挑选一个适合于应用程序。)



Answer 2:

您可以使用rdtsc 。只是从现值减去前值的时间差之间计算。

载荷处理器的时间戳计数器(64位MSR)到EDX的当前值:EAX寄存器。 EDX寄存器加载有高阶的MSR和EAX寄存器的32位中装入低位32位。 (在支持英特尔64体系结构处理器,每个RAX和RDX的高阶32位被清除)。

这是一个C代码,将实现该指令 : -

unsigned long long int rdtsc(void)
{
   unsigned long long int x;
   unsigned a, d;

   __asm__ volatile("rdtsc" : "=a" (a), "=d" (d));

   return ((unsigned long long)a) | (((unsigned long long)d) << 32);;
}


Answer 3:

这里是一个FORTRAN程序调用该做的:

汇编指令RDTSC返回一个64位整数这是自今年点CPU时钟计数的数量。 如果您的FORTRAN有64位整数,KOUNT是刚刚宣布的说法是INTEGER * 8。 否则宣告它是两个32位INTEGER * 4点的阵列

因此,在您FORTRAN程序编写

CALL TIMERR(KOUNT)

在开始时,保存KOUNT的值,然后重复底。 然后减去两个64位值来确定所经过的时间。 我一般只懒得减去两个下部即,正如我时间通常小于2 ^ 32个系统时钟

这也是由C来调用,但我不说话C.

; C This assembler routine looks to FORTRAN like this:
;       SUBROUTINE TIMERR(KOUNT)
;       INTEGER*4 KOUNT(2);  or INTEGER*8 KOUNT
;       ...get a 64-but system time value into KOUNT......
;       RETURN
;       END
;
.Code
_TIMERR@4: RDTSC
         Push Eax
    Push Ecx
    Push Edx
    Mov Ecx, [Esp + 16]
    Mov [Ecx], Eax
    Mov [Ecx + 4], Edx
    Pop Edx
    Pop Ecx
    Pop Eax
    Ret 4


文章来源: Time sources in x86 processors