<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Rdtsc</id>
	<title>Rdtsc - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Rdtsc"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=Rdtsc&amp;action=history"/>
	<updated>2026-07-17T20:50:47Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=Rdtsc&amp;diff=7678&amp;oldid=prev</id>
		<title>imported&gt;Alex NB OT: замена имён и значений устаревшего неподдерживаемого InternetArchiveBot формата параметров доступности ссылок (3), замена устаревших имён параметров (4)</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=Rdtsc&amp;diff=7678&amp;oldid=prev"/>
		<updated>2025-07-16T10:11:34Z</updated>

		<summary type="html">&lt;p&gt;замена имён и значений устаревшего неподдерживаемого InternetArchiveBot формата параметров доступности ссылок (3), замена устаревших имён параметров (4)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;rdtsc&amp;#039;&amp;#039;&amp;#039; ({{lang-en|Read Time Stamp Counter}}) — [[ассемблер]]ная инструкция для платформ [[x86]] и [[x86_64]], читающая счётчик TSC ({{lang-en2|Time Stamp Counter}}) и возвращающая в [[Регистр процессора|регистрах]] EDX:EAX 64-битное количество [[Такт (процессор)|тактов]] с момента последнего сброса [[Центральный процессор|процессора]].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;rdtsc&amp;#039;&amp;#039; поддерживается в процессорах [[Pentium]] (и совместимых с ними) и более новых. [[Опкод]]: &amp;#039;&amp;#039;&amp;#039;0F 31&amp;#039;&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{книга |заглавие=Intel® 64 and IA-32 Architectures Software Developer’s Manual |ссылка=http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf |том=2 (Instruction Set Reference) |страницы=4—301 |язык=en |archive-date=2013-10-20 |archive-url=https://web.archive.org/web/20131020144800/http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;rdtscp&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;Сериализующий вариант инструкции rdtsc, также читающий IA32_TSC_AUX MSR, в котором часто хранится номер ядра.&amp;lt;/ref&amp;gt; поддерживается начиная с Intel [[Nehalem]] и AMD Family 0x0F&amp;lt;ref&amp;gt;{{Cite web |url=http://msdn.microsoft.com/en-us/library/bb385235.aspx |title=rdtscp&amp;lt;!-- Заголовок добавлен ботом --&amp;gt; |access-date=2011-11-01 |archive-date=2012-01-02 |archive-url=https://web.archive.org/web/20120102091859/http://msdn.microsoft.com/en-us/library/bb385235.aspx |url-status=live }}&amp;lt;/ref&amp;gt;. Опкод: &amp;#039;&amp;#039;&amp;#039;0F 01 F9&amp;#039;&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{книга |заглавие=Intel® 64 and IA-32 Architectures Software Developer’s Manual |ссылка=http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf |том=2 (Instruction Set Reference) |страницы=4—303 |язык=en |archive-date=2013-10-20 |archive-url=https://web.archive.org/web/20131020144800/http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Использование ==&lt;br /&gt;
&amp;#039;&amp;#039;rdtsc&amp;#039;&amp;#039; чаще всего используется:&lt;br /&gt;
* для измерения времени;&lt;br /&gt;
* для точного измерения временных интервалов, в том числе при проведении оптимизации (измерение времени, необходимого для выполнения конкретных инструкций или их набора);&lt;br /&gt;
* в антиотладочных целях;&amp;lt;ref&amp;gt;{{Cite web |url=http://www.symantec.com/connect/articles/windows-anti-debug-reference |title=Windows Anti-Debug Reference {{!}} Symantec Connect Community&amp;lt;!-- Заголовок добавлен ботом --&amp;gt; |access-date=2011-12-30 |archive-date=2012-01-14 |archive-url=https://web.archive.org/web/20120114102646/http://www.symantec.com/connect/articles/windows-anti-debug-reference |url-status=live }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.donkeyonawaffle.org/misc/Source_Boston_2009-Antidebugging-Dev-Release.pdf Слайд 58 Timing Based Anti-Debugging] {{webarchive|url=https://web.archive.org/web/20120304030832/http://www.donkeyonawaffle.org/misc/Source_Boston_2009-Antidebugging-Dev-Release.pdf |date=2012-03-04 }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* как источник [[Энтропия|энтропии]] для [[Генератор псевдослучайных чисел|генераторов псевдослучайных чисел]].&amp;lt;ref&amp;gt;Tom St. Denis, Simon Johnson, [https://books.google.ru/books?id=VaiYIZHduXQC&amp;amp;pg=PA100 Cryptography for developers] {{Wayback|url=https://books.google.ru/books?id=VaiYIZHduXQC&amp;amp;pg=PA100 |date=20211009211432 }}.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Преимущества ==&lt;br /&gt;
В сравнении с предоставляемыми [[Операционная система|операционными системами]] [[API]] вроде WINAPI::QueryPerformanceCounter() или gettimeofday() инструкции rdtsc/rdtscp могут предоставлять следующие преимущества:&lt;br /&gt;
* Более высокая точность, особенно в случае архитектур и устаревших операционных систем, не имеющих полноценной поддержки [[HPET]]. Такие ОС используют системный таймер невысокой точности (иногда до слайса планировщика, OsTimeSlice, порядка единиц-десятков миллисекунд).&lt;br /&gt;
* Меньшие накладные расходы: инструкции rdtsc/rdtscp исполняются за время порядка десятка тактов, что значительно быстрее выполнения системных вызовов.&lt;br /&gt;
* Не требуют переключения в привилегированный режим [[Кольца защиты|Ring0]] или в гипервизор в большинстве систем (если команда разрешена в данной ОС).&lt;br /&gt;
&lt;br /&gt;
== Проблемы использования ==&lt;br /&gt;
* Должны быть предусмотрены режимы работы программ, не требующие данной команды, поскольку RDTSC/RDTSCP потенциально могут быть недоступны или запрещены к использованию на конечной системе, где будет использоваться приложение:&lt;br /&gt;
** на очень старых процессорах (например, [[80486]]) либо на системах, реализующих архитектуру x86 не в полном объёме.&lt;br /&gt;
** инструкция может быть потенциально превращена в привилегированную (операционной системой установлен 3-й бит в управляющем регистре CR4), и её использование приведет к генерации [[Исключение (программирование)|исключения]] в программе.&lt;br /&gt;
** инструкцию могут перехватывать системы виртуализации, её использование будет приводить к гипервызову.&lt;br /&gt;
&lt;br /&gt;
* Режим энергосбережения может влиять на подсчёт тактов:&lt;br /&gt;
** При динамическом изменении частоты процессором (снижения и повышения частоты в технологиях SpeedStep, Turbo Boost, Cool&amp;amp;Quiet и подобных) изменяется скорость работы счётчика TSC.&lt;br /&gt;
** Переход процессора в режим глубокого сна C3 останавливает счётчик TSC на старых процессорах.&lt;br /&gt;
** В современных процессорах [[Intel]] ([[Nehalem]] и более новых) и [[Advanced Micro Devices|AMD]] (предположительно, начиная с [[K10]] Barcelona/Phenom) счётчик TSC не зависит от использования технологий энергосбережения и увеличивается с постоянной частотой вне зависимости от того, на какой частоте работает процессор, и работал ли он или находился в состоянии сна. Такой счётчик называется инвариантным (&amp;#039;&amp;#039;invariant TSC&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
* Точные замеры могут быть невозможны при однократном исполнении измеряемого фрагмента инструкций из-за влияния кэшей процессора при обращении к памяти. Традиционно решается многократным измерением фрагмента программы или повторением измеряемого фрагмента в цикле.&lt;br /&gt;
* RDTSC может переупорядочиваться с замеряемыми командами на Out-of-Order процессорах. Переупорядочивание можно запретить добавлением сериализующих команд (например, CLD/CLC для [[Pentium]] моделей P5, P54&amp;lt;ref&amp;gt;[http://www.codingnow.com/2000/download/pentopt.htm#30 How to optimize for the Pentium family of microprocessors] {{Wayback|url=http://www.codingnow.com/2000/download/pentopt.htm#30 |date=20120106112728 }} // 1996—2000 by Agner Fog. Chapter «30. Testing speed», [http://wasm.ru/article.php?article=1010031 перевод] {{webarchive|url=https://web.archive.org/web/20111119130647/http://www.wasm.ru/article.php?article=1010031 |date=2011-11-19 }}&amp;lt;/ref&amp;gt; или cpuid для более новых) или использованием RDTSCP.&lt;br /&gt;
* Измерения длительности коротких фрагментов могут быть нестабильными в многоядерных и многопроцессорных системах, или при использовании HyperThreading из-за взаимного влияния со стороны других потоков и загруженности разделяемых процессорных блоков.&lt;br /&gt;
&lt;br /&gt;
* Счётчики TSC в редких случаях могут быть несинхронизированы в некоторых многоядерных или многопроцессорных системах, в частности:&lt;br /&gt;
** При инициализации процессоров.&lt;br /&gt;
** Возможна рассинхронизация счётчиков в ранних многоядерных системах из-за неверной инициализации процессоров некоторыми BIOS. Исправляется обновлением BIOS или обновлением операционной системы. Существуют программы для проверки на наличие этой ошибки.&amp;lt;ref&amp;gt;{{Cite web |url=http://www.ice-graphics.com/ICEAffinity/IndexR.html |title=ICE Affinity |access-date=2011-10-19 |archive-date=2011-09-07 |archive-url=https://web.archive.org/web/20110907072533/http://www.ice-graphics.com/ICEAffinity/IndexR.html |url-status=live }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Операционная система может переключать поток между разными ядрами, имеющими не синхронизированные счётчики. На прикладном уровне можно отследить факт смены ядра на многоядерных системах при помощи инструкции RDTSCP, которая, работая аналогично RDTSC, дополнительно возвращает в регистре ECX номер логического процессора.&lt;br /&gt;
&lt;br /&gt;
Для решения многих проблем рекомендуется фиксирование потока на конкретном процессоре (&amp;#039;&amp;#039;cpu affinity&amp;#039;&amp;#039;) и отключение технологий автоматического изменения частоты (технологий энергосбережения и динамического изменения производительности).&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания|colwidth=25em}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
{{Викиучебник|Примеры использования rdtsc в языках высокого уровня|Примеры использования rdtsc в языках высокого уровня}}&lt;br /&gt;
* [http://developer.intel.com/design/processor/manuals/253667.pdf Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 2B: Instruction Set Reference, N-Z], стр. 355—356&lt;br /&gt;
* [http://www.strchr.com/performance_measurements_with_rdtsc Полезная статья «Performance measurements with RDTSC»]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Инструкции x86]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Alex NB OT</name></author>
	</entry>
</feed>