2012-09-01 3 views
4

시간을 측정하는 데 사용할 수있는 x86 명령어를 아는 사람이 있습니까? 소프트웨어로 작업 스위치에 액세스 할 수있는 타이머가 있습니까?x86 프로세서의 시간 소스

+1

C를 말하지 않는다 당신은 기계 코드 레벨에서 그렇게하고 싶습니까? 하드웨어 인터럽트 및 타이머에 액세스하기위한 일부 포트 주소가 있습니다. 그러나 15 년이 지난 지금 제가 마지막으로 읽었습니다. – JohnB

+0

최소 PIT 예 : https://github.com/cirosantilli/x86-bare-metal-examples/blob/9a24f92f36a45abb3f8c37aafc0c3ee9b15563ab/in_pit.S#L2, 최소 RTC 예 : https://github.com/cirosantilli/x86-bare -metal-examples/blob/9a24f92f36a45abb3f8c37aafc0c3ee9b15563ab/in_rtc.S –

답변

2

rdtsc을 사용할 수 있습니다. 현재 값에서 이전 값을 차감하여 시간차를 계산합니다.

프로세서의 타임 스탬프 카운터 ( 64 비트 MSR)의 현재 값을 EDX : EAX 레지스터에로드합니다. EDX 레지스터는 MSR의 상위 32 비트와 함께 으로로드되고 EAX 레지스터는 하위 32 비트가있는 으로로드됩니다. (인텔 64 구조를 지원하는 프로세서에서, RAX 및 RDX의 각각의 상위 32 비트는 해제된다.)

This is a C code which implements this instruction - 온 시간을 측정

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);; 
} 
+0

RDTSC에는 정확성에 영향을 줄 수있는 몇 가지 제한 사항이 있습니다. (1) 직렬화가 아니며 CPU 파이프 라인의 내용에 영향을받을 수 있습니다. (2) CPU 주파수는 전원 관리, Intel Turbo Boost 또는 Thermal Throttling로 인해 변동될 수 있습니다. (3) 다중 CPU/멀티 코어 시스템에서 코어가 실행되는 명령은 무엇입니까? –

+0

@msemack'rdtscp'가있는 현재 (2016) 프로세서는 대소 문자 (1)를 처리합니다. – JAB

9

방법 x86 플랫폼 :

  • 실시간 시계 - OS의 시간 및 날짜 소스. 1 초 정밀도. 절대 시간을 측정하는 데 사용할 수있는 표준 PC의 유일한 시간 원본입니다.

  • 8254 Counter/Timers - PC가 시작된 이래로 마더 보드에 있던 표준 카운터/타이머 칩 (현재 칩셋 내부의 기능 블록). 이것은 IRQ0의 전통적인 소스이며, 대부분의 구형 OS에서 작업을 전환하는 타이머 인터럽트입니다.

  • RDTSC 어셈블리 명령어 - CPU 클럭 사이클을 계산합니다. 사용법에 대한 자세한 내용은 Anon ymous의 답변을 참조하십시오. x86의 시간 소스에서 찾을 수있는 최고 수준의 정확성. 그러나 정확성이있는 몇 가지 문제가 있습니다. 또한 어셈블리로 작성하는 경우 가장 편리한 옵션입니다.

  • RDTSCP 어셈블리 명령어 - RDTSC와 유사하지만 RDTSC의 정확성 문제를 해결하는 직렬화되었습니다. 최신 프로세서에서만 발견되었습니다.

  • HPET - PC의 Core Duo 시대에 소개되었습니다. 최신 OS는이를 업무 스케줄링 인터럽트 (Vista 이상)로 사용합니다. (비스타 이상)

  • 칩 세트의 독점 타이머 - 일부 칩셋에는 전원 관리 및 멀티미디어 기능을 위해 특수 타이머가 내장되어 있습니다 . 범용 PC가 아닌 고정 된 기능의 임베디드 시스템을 사용한다고 가정 할 때, 때로는 자신의 응용 프로그램에 맞게 이러한 명령을 내릴 수 있습니다.

OS 및 하드웨어에 따라 이러한 옵션을 모두 사용할 수있는 것은 아닙니다. 최신 OS (Windows, Linux)에서 실행중인 경우 자체 타이밍 요구 사항에 따라 8254/HPET를 제어하므로 사용할 수 없습니다.

최신 운영 체제에서는 일반적으로 OS 제공 타이밍 기능을 사용하는 것이 가장 좋습니다. OS 개발자는 사용하려고하면 스스로 해결할 많은 문제를 해결했을 것입니다. (OS는 여러 타이밍 기능을 제공 할 수 있으므로 애플리케이션에 적합한 기능을 선택하십시오.

어셈블러 명령 RDTSC가 시계가 올해 도트부터 계산 CPU의 수를 64 비트 정수를 반환) 여기

0

그것을 수행하는 FORTRAN 호출 루틴입니다. FORTRAN에 64 비트 정수가 있으면 KOUNT 인수는 INTEGER * 8로 선언됩니다. 다른 두 개의 32 비트 정수의 배열로 선언 *

4의는 그래서 FORTRAN 프로그램에서 당신은 마지막에 반복 한 후, KOUNT의 값을 저장, 시작에

CALL TIMERR(KOUNT) 

물품. 그런 다음 두 개의 64 비트 값을 빼서 경과 시간을 결정하십시오. 나는 시간은 또한 C에서 호출의 보통 이하 32^2에 비해 시스템 클럭

무엇으로 내가 일반적으로 단지 두 개의 낮은 단어를 뺄 귀찮게,하지만 난

; 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 
[email protected]: 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