Чертовщина со временем в виртуалках с Win8/10
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 29.12.15 10:45
Оценка:
В качестве быстрого и точного таймера для отладочных целей я давно использую TSC. На железе у меня стоят только XP и Win7 (32/64), а Win8/8.1/10 — только в виртуалках под VMware Workstation (сейчас 8.0.6, раньше были 5.x-6.x).

Поскольку гипервизор VMware по умолчанию перехватывет RDTSC, в настройках большинства виртуалок стоит запрет перехвата (monitor_control.virtual_rdtsc = false). В итоге точное измерение даже наносекундных интервалов внутри гостевых систем уже лет десять работает совершенно чудесно. Таким образом, под XP/Win7 — как на железе, так и в виртуалках — до недавних пор проблем не возникало.

Недавно стал обнаруживать странное поведение отлаживаемого софта под гостевыми восьмерками/десяткой. Поскольку под ними я тестирую мало, поначалу не обращал внимания, но вчера потребовалось проверить пристально, и обнаружилось, что под ними TSC периодически резко меняется на несколько секунд. И ладно бы это было только в user-mode, но и в ядре происходит то же самое.

Но как, Холмс? Напомню, в параметрах виртуалок стоит запрет перехвата RDTSC — то есть, VMM честно исполняет гостевую RDTSC на хостовом процессоре. Поскольку в хостовой системе никаких сбоев в работе TSC не наблюдается, возникает подозрение, что восьмерки/десятка перехватывают RDTSC и в ядре тоже. Если это так, то зачем это делается, и почему не удается найти на этот счет никакой информации? Если винда RDTSC не перехватывает — отчего значения TSC внезапно и резко меняются?

Кстати, это может быть связано со странным поведением времени в гостевых восьмерках/десятках под Workstation 8.0.6: если запустить запись/воспроизведение звука — системное время начинает тормозить в полтора-два раза, а через несколько секунд после остановки звукового потока начинает "догоняться" ускоренным темпом. Спрашивал об этом на форуме VMware, но оттуда, похоже, уже давно ушли все сколько-нибудь толковые люди.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.