시간을 측정하는 데 사용할 수있는 x86 명령어를 아는 사람이 있습니까? 소프트웨어로 작업 스위치에 액세스 할 수있는 타이머가 있습니까?x86 프로세서의 시간 소스
답변
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);;
}
RDTSC에는 정확성에 영향을 줄 수있는 몇 가지 제한 사항이 있습니다. (1) 직렬화가 아니며 CPU 파이프 라인의 내용에 영향을받을 수 있습니다. (2) CPU 주파수는 전원 관리, Intel Turbo Boost 또는 Thermal Throttling로 인해 변동될 수 있습니다. (3) 다중 CPU/멀티 코어 시스템에서 코어가 실행되는 명령은 무엇입니까? –
@msemack'rdtscp'가있는 현재 (2016) 프로세서는 대소 문자 (1)를 처리합니다. – JAB
방법 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 비트 정수를 반환) 여기
그것을 수행하는 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
C를 말하지 않는다 당신은 기계 코드 레벨에서 그렇게하고 싶습니까? 하드웨어 인터럽트 및 타이머에 액세스하기위한 일부 포트 주소가 있습니다. 그러나 15 년이 지난 지금 제가 마지막으로 읽었습니다. – JohnB
최소 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 –