Определить частоту TSC в Linux
Учитывая x86 с постоянным TSC, который полезен для измерения в реальном времени, как можно преобразовать "единицы" эталонных циклов TSC в обычные человеческие единицы реального времени, такие как наносекунды, используя калибровочный коэффициент TSC, рассчитанный Linux во время загрузки?
То есть, безусловно, можно рассчитать частоту TSC на земле пользователя, выполнив измерения TSC и тактовых импульсов (например, с помощью CLOCK_MONOTONIC
) на обоих концах некоторого интервала, чтобы определить частоту TSC, но Linux уже сделал этот расчет во время загрузки, так как он внутренне использует TSC, чтобы помочь с хронометрированием.
Например, вы можете увидеть результат ядра с dmesg | grep tsc
:
[ 0.000000] tsc: PIT calibration matches HPET. 2 loops
[ 0.000000] tsc: Detected 3191.922 MHz processor
[ 1.733060] tsc: Refined TSC clocksource calibration: 3192.007 MHz
В худшем случае, я думаю, вы могли бы попытаться получить результат из dmesg
во время выполнения, но это откровенно кажется ужасным, хрупким и всякого рода плохим0.
Преимущества использования времени калибровки, определенного ядром, многочисленны:
- Вам не нужно самостоятельно писать процедуру калибровки TSC, и вы можете быть уверены, что Linux - лучший в своем роде.
- Вы автоматически выбираете новые методы калибровки TSC, когда новые ядра выходят с использованием вашего существующего двоичного файла (например, недавно чипы начали рекламировать свою частоту TSC, используя
cpuid
лист 0x15, поэтому калибровка не всегда нужна). - Вы не замедляете свой запуск с калибровкой TSC.
- Вы используете одно и то же значение TSC при каждом запуске вашего процесса (по крайней мере, до перезагрузки).
- Ваша частота TSC каким-то образом "соответствует" частоте TSC, используемой функциями хронометража ОС, такими как
gettimeofday
а такжеclock_gettime
1 - Ядро способно выполнять калибровку TSC очень рано при загрузке, в режиме ядра, не подвергаясь угрозам прерываний и других процессов, и может получить доступ к базовому направлению аппаратных таймеров в качестве источника калибровки.
Хотя это еще не все, некоторые недостатки использования TSC-калибровки в Linux включают в себя:
- Он не будет работать на каждой установке Linux (например, возможно, на тех, которые не используют тактовый источник tsc) или на других ОС вообще, так что вы все равно можете застрять при написании метода резервной калибровки.
- Есть основания полагать, что "недавняя" калибровка может быть более точной, чем старая, особенно та, которая была сделана сразу после загрузки: поведение кристалла может измениться, особенно при изменении температуры, поэтому вы можете получить более точную частоту, выполнив ее вручную близко к точке, где вы будете его использовать.
0 Например: системы могут не иметь dmesg
Установлено, вы не сможете запустить его как обычный пользователь, накопленный вывод может быть обернут, так что строки больше не присутствуют, вы можете получить ложные срабатывания на вашем grep, сообщения ядра являются английской прозой и могут быть изменены, может быть сложно запустить подпроцесс и т. д. и т. д.
1 Это несколько спорно имеет ли это - но если вы смешиваете rdtsc
вызывает с кодом, который также использует хронометраж ОС, это может повысить точность.