Determinar a frequência TSC no Linux

Dado um x86 com umTSC constante, que é útil para medir em tempo real, como é possível converter entre as "unidades" dos ciclos de referência TSC e as unidades humanas normais em tempo real, como nanossegundosusando o fator de calibração TSC calculado pelo Linux no momento da inicialização?

Ou seja, certamente pode-se calcular a frequência da TSC na terra do usuário fazendo medições da TSC e do relógio (por exemplo, comCLOCK_MONOTONIC) nas duas extremidades de um intervalo para determinar a frequência do TSC, mas o Linux já fez esse cálculo no momento da inicialização, pois ele usa internamente o TSC para ajudar na manutenção do tempo.

Por exemplo, você pode ver o resultado do kernel comdmesg | 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

Em um cenário de pior caso, acho que você poderia tentar obter o resultado dedmesg em tempo de execução, mas isso parece francamente terrível, frágil e todo tipo de mau0.

As vantagens de usar o tempo de calibração determinado pelo kernel são muitas:

Você não precisa escrever uma rotina de calibração TSC e pode ter certeza de que a Linux é a melhor da categoria.Você escolhe automaticamente novas técnicas de calibração TSC à medida que novos kernels são lançados usando o binário existente (por exemplo, chips recentemente começaram a anunciar sua frequência TSC usandocpuid folha 0x15, portanto, a calibração nem sempre é necessária).Você não diminui a velocidade da inicialização com uma calibração do TSC.Você usa o mesmo valor TSC em todas as execuções do seu processo (pelo menos até a reinicialização).Sua frequência TSC é de alguma forma "consistente" com a frequência TSC usada pelas funções de manutenção do tempo do SO, comogettimeofday eclock_gettime1.O kernel é capaz de fazer a calibração do TSC muito cedo na inicialização, no modo kernel, livre de flagelos de interrupções e outros processos e é capaz de acessar a direção dos temporizadores do hardware subjacente como sua fonte de calibração.

Porém, nem tudo é molho, algumas desvantagens do uso da calibração TSC do Linux incluem:

Ele não funcionará em todas as instalações do Linux (por exemplo, talvez aquelas que não usam uma fonte de relógio tsc) ou em outros sistemas operacionais, então você ainda pode estar preso ao escrever um método de calibração de fallback.Há alguma razão para acreditar que uma calibração "recente" pode ser mais precisa do que uma antiga, especialmente uma realizada logo após a inicialização: o comportamento do cristal pode mudar, especialmente quando as temperaturas mudam, para que você possa obter uma frequência mais precisa fazendo isso manualmente perto do ponto em que você o usará.

0 Por exemplo: sistemas podem não terdmesg instalado, talvez você não consiga executá-lo como um usuário comum, a saída acumulada pode ter se espalhado para que as linhas não estejam mais presentes, você pode obter falsos positivos no grep, as mensagens do kernel são em prosa em inglês e estão sujeitas a alterações, pode ser difícil iniciar um subprocesso etc., etc.

1 É um pouco discutível se isso importa - mas se você está misturandordtsc Se você ligar com um código que também usa a manutenção do tempo do SO, pode aumentar a precisão.

questionAnswers(0)

yourAnswerToTheQuestion