Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Метка времени Счетчик ( ТСК ) представляет собой 64-битовый регистр присутствует на всех x86 процессоров с момента Pentium . Подсчитывает количество циклов ЦП с момента его сброса. Инструкция RDTSCвозвращает TSC в EDX: EAX. В режиме x86-64RDTSC также очищает старшие 32 бита RAX и RDX . Его опкод это 0F 31. [1] У конкурентов Pentium, таких как Cyrix 6x86 , не всегда был TSC, и это могло считаться RDTSCнезаконной инструкцией. Cyrix включила счетчик отметок времени в свой MII.

Используйте [ редактировать ]

Счетчик отметок времени когда-то был отличным способом получения информации о времени ЦП с высоким разрешением и малыми накладными расходами для программы. С появлением многоядерных / гиперпоточных ЦП, систем с несколькими ЦП и гибернационных операционных систем, нельзя полагаться на то, что TSC предоставит точные результаты - если не будут приняты особые меры для исправления возможных недостатков: скорости тиков и того, имеют ли все ядра (процессоры) одинаковые значения в своих регистрах хронометража. Нет никаких обещаний, что счетчики временных меток нескольких процессоров на одной материнской плате будут синхронизированы. Следовательно, программа может получить надежные результаты, только ограничившись запуском на одном конкретном процессоре. Даже в этом случае скорость ЦП может измениться из-за мер по энергосбережению, предпринятых ОС или BIOS , или система может быть переведена в спящий режим и позже возобновлена, сбрасывая TSC. В этих последних случаях, чтобы оставаться актуальной, программа должна периодически перекалибровать счетчик.

Использование TSC также снижает переносимость, поскольку другие процессоры могут не иметь подобной функции. Последние процессоры Intel включают TSC с постоянной скоростью (идентифицируется sysctl kern.timecounter.invariant_tsc во FreeBSD или constant_tscфлагом " " в Linux /proc/cpuinfo). У этих процессоров TSC тикает на номинальной частоте процессора, независимо от фактической тактовой частоты процессора из-за состояний турбо или энергосбережения. Следовательно, тики TSC подсчитывают время, а не количество прошедших тактовых циклов ЦП.

На платформах Windows Microsoft настоятельно не рекомендует использовать TSC для синхронизации с высоким разрешением именно по этим причинам, предоставляя вместо этого Windows API QueryPerformanceCounter и QueryPerformanceFrequency. [2] В системах POSIX программа может получить аналогичную функцию, прочитав значение CLOCK_MONOTONIC_RAWчасов с помощью clock_gettimeфункции. [3]

Начиная с Pentium Pro , процессоры Intel практиковали выполнение вне очереди , когда инструкции не обязательно выполняются в том порядке, в котором они появляются в программе. Это может привести к тому, что процессор выполнится RDTSCраньше, чем ожидает простая программа, что приведет к неверному счету циклов. [4] Программист может решить эту проблему, вставив инструкцию сериализации, такую ​​как CPUID , для принудительного завершения каждой предыдущей инструкции перед продолжением программы. Эта RDTSCPинструкция является вариантом RDTSCчастичной сериализации потока инструкций, но ее не следует рассматривать как сериализацию.

Реализация в различных процессорах [ править ]

Семейства процессоров Intel увеличивают счетчик отметок времени по-разному: [5]

  • Для процессоров Pentium M (семейство [06H], модели [09H, 0DH]); для процессоров Pentium 4, процессоров Intel Xeon (семейство [0FH], модели [00H, 01H или 02H]); и для процессоров семейства P6: счетчик отметок времени увеличивается с каждым внутренним тактовым циклом процессора. Такт внутреннего процессора определяется текущим соотношением тактовой частоты ядра к тактовой частоте шины. Переход на технологию Intel SpeedStep также может повлиять на тактовую частоту процессора.
  • Для процессоров Pentium 4, процессоров Intel Xeon (семейство [0FH], модели [03H и выше]); для процессоров Intel Core Solo и Intel Core Duo (семейство [06H], модель [0EH]); для процессоров Intel Xeon серии 5100 и Intel Core 2 Duo (семейство [06H], модель [0FH]); для процессоров Intel Core 2 и Intel Xeon (семейство [06H], display_model [17H]); для Intel Atomпроцессоры (семейство [06H], display_model [1CH]): счетчик отметок времени увеличивается с постоянной скоростью. Эта частота может быть установлена ​​максимальным соотношением частоты ядра к частоте шины процессора или может быть установлена ​​максимальной разрешенной частотой, с которой загружается процессор. Максимальная разрешенная частота может отличаться от максимальной разрешенной частоты процессора.

Конкретная конфигурация процессора определяет поведение. Постоянное поведение TSC гарантирует, что длительность каждого тактового сигнала одинакова, и позволяет использовать TSC в качестве таймера настенных часов, даже если ядро ​​процессора меняет частоту. Это архитектурное поведение для всех более поздних процессоров Intel.

Процессоры AMD до ядра K8 всегда увеличивали счетчик отметок времени каждый такт. [6] Таким образом, функции управления питанием могли изменять количество приращений в секунду, и значения могли не синхронизироваться между различными ядрами или процессорами в одной и той же системе. Для Windows AMD предоставляет утилиту [7] для периодической синхронизации счетчиков на многоядерных процессорах. Начиная с семейства 10h (Barcelona / Phenom), чипы AMD имеют постоянный TSC, который может управляться либо скоростью HyperTransport, либо самым высоким состоянием P. Об этом сообщает бит CPUID ( Fn8000_0007:EDX_8); Процессоры Intel также сообщают свой инвариантный TSC на этом бите.

Использование операционной системы [ править ]

Операционная система может предоставлять методы, которые используют и не используют RDTSCинструкции для хронометража под контролем администратора. Например, в некоторых версиях Linux ядра, Seccomp Песочница режим отключает RDTSC. [8] Его также можно отключить с помощью PR_SET_TSCаргумента prctl()системного вызова. [9]

Использование в атаках по побочному каналу кэша [ править ]

Счетчик отметок времени может использоваться для точного определения времени инструкций, которые могут быть использованы в уязвимостях безопасности Meltdown и Spectre . [10] [11] Однако, если это недоступно, можно использовать другие счетчики или таймеры, как в случае с процессорами ARM , уязвимыми для этого типа атак.

Другие архитектуры [ править ]

У других процессоров также есть регистры, которые подсчитывают тактовые циклы ЦП, но с другими именами. Например, на AVR32 он называется регистром счетчика тактовой частоты (PCCNT). SPARC V9 предоставляет TICKрегистр. PowerPC предоставляет 64-битный TBRрегистр.

Архитектуры ARMv7 [12] и ARMv8 [13] предоставляют общий счетчик, который считает с постоянной частотой. ARMv7 предоставляет регистр счетчика циклов ( инструкция CCNT ) для чтения и записи счетчика, но эта инструкция является привилегированной. [14]

См. Также [ править ]

  • Таймер событий высокой точности (HPET)

Ссылки [ править ]

  1. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 Том 2B: Справочник по набору инструкций, MZ (PDF) . п. 545.
  2. ^ Время игры и многоядерные процессоры . С. 251–252.
  3. ^ "clock_getres, clock_gettime, clock_settime - часы и функции таймера" .
  4. ^ «Использование инструкции RDTSC для мониторинга производительности» (PDF) .
  5. ^ «Том 3A, Глава 16». Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 .
  6. ^ «Том 3». Руководство программиста по архитектуре AMD64 .
  7. ^ «AMD Dual-Core Optimizer» .
  8. ^ "cr0 blog: счетчик отметок времени, отключающий странности в ядре Linux" . Май 2009 г.
  9. ^ prctl(2)  -  Руководство программиста Linux - Системные вызовы
  10. ^ "meltdown.c" .
  11. ^ "Spectre.c" .
  12. ^ "Справочное руководство по ARMv7" .
  13. ^ "Справочное руководство ARMv8" .
  14. ^ «Регистр счетчика циклов (CCNT)» . ARM Ltd. Получено 5 марта 2021 года .

Внешние ссылки [ править ]

  • cycle.h - код C для чтения таймера высокого разрешения на многих процессорах и компиляторах.
  • [1] - Очень простой код C для чтения таймера на машине x86. Это считывает 64-битное значение в два 32-битных целых числа и объединяет их - другой вариант - использование только одного 64-битного целого числа. [ требуется разъяснение ]
  • Инженер AMD о дрейфе TSC в процессорах AMD