NTP und NTPD Nanokernel

7

Ich hatte einige Fragen zum NTP-Nanokernel, wie hier erklärt: http://www.eecis.udel.edu/~mills/database/brief/nano/nano.pdf

Die große Frage ist, wie es diesem Nanokernel gelingt, eine Genauigkeit zu liefern, die unter dem Systemtakt liegt (z. B. ns-Genauigkeit).

Ich habe ein paar sekundäre Fragen:

  1. Ob und wann wurde diese Änderung in den Linux-Kernel der Hauptzeile übernommen?
  2. Zweitens scheint der Nanokernel eine aggregierte Kombination aus dem CPU-Takt-Tick (bei welcher Hz auch immer eingestellt ist) und einem Taktzykluszähler zu verwenden.

"Prozesszykluszähler (PCC) zum Interpolieren von Mikrosekunden oder Nanosekunden zwischen Tick-Interrupts"

Wie wird der Zykluszähler verwendet, da er meines Wissens keinen Interrupt liefert und der Nanokernel den Prozessorregistrierungswert, der den aktuellen Zähler enthält, kontinuierlich liest?

  1. Ändert NTPD jemals die CPU-Taktfrequenz oder verwaltet es nur einen Software-Takt, bei dem die berechnete Taktanpassung angewendet wird?
Spitzel
quelle
In Bezug auf # 2 wird die genaueste Zeitsynchronisation in NTP mithilfe eines PPS-Signals (Pulse Per Second) erreicht, das genau zu Beginn der Sekunde einen Interrupt auslöst (vorausgesetzt, die richtige Einrichtung, z. B. müssen Sie möglicherweise sogar die durch verursachte Latenz berücksichtigen Kabellänge). Auf welche "Uhr" beziehen Sie sich für # 3? Die meisten modernen x86-CPUs verwenden TSC als Taktquelle, aber es ist nur ein Zähler. Der Kernel hat die reale UTC-Zeitdarstellung, und dies wird aktualisiert, indem die Uhr basierend auf dem TSC-Zähler leicht beschleunigt oder verlangsamt wird.
Thomas Guyot-Sionnest

Antworten:

2

Hinweis: Obwohl NTP die Idee eines Nanokernels hatte, mit dem Betriebssysteme gepatcht werden können, die kein NTP verwenden, ist dies in Linux in diesem Fall nicht der Fall. Der NTP-Code befindet sich im Kernel selbst, wie Sie in Frage 1 anspielen .

0: Wie schafft es dieser Nanokernel, eine Genauigkeit zu liefern, die unter dem Systemtakt liegt (z. B. ns-Genauigkeit)?

Eine Genauigkeit, die größer als die Genauigkeit der Systemtakt-Ticks ist, wird durch die aggregierte Genauigkeit anderer Computer oder Geräte erreicht. Das Systemuhr-Häkchen gibt an, wie oft das Häkchen dieses Computers aktualisiert wird. Die Anzahl der Genauigkeitsstellen ist jedoch in der jeweiligen verwendeten Software definiert, z. B. im Betriebssystem, das häufig auf POSIX-Standards basiert. Wie Sie bereits erwähnt haben, gehen die POSIX-Standards für einige Zeitstrukturen auf Nanosekundengenauigkeit zurück.

Angenommen, ich habe auf meinem Computer ein GPS-Gerät oder eine Art ausgefallene Atomuhr angeschlossen, um zu sehen, wie wir eine höhere Genauigkeit als die Genauigkeit der Systemuhr erzielen können. Immer wenn mich jemand fragt, wie spät es ist, konsultiere ich einfach diese Uhr und gebe sie heraus.

Wenn sich ntp wie für Linux im Kernel befindet, kann diese GPS- Gerätezeit anstelle der Systemuhrzeit in gettimeofday () -Aufrufen verwendet werden.

Was die Uhr des Computers betrifft, vergleiche ich die Zeit, die ich mit dem GPS oder der Atomuhr erhalte, mit der Zeit des Computers. Wenn sie mehr als einen Tick entfernt ist, stelle ich sie mit adjtime (), wie in der Antwort auf Frage 3 beschrieben, zurück .

  1. Ob und wann wurde diese Änderung in den Linux-Kernel der Hauptzeile übernommen?

Die NTP-Nanokernel-Idee wurde in der NTP-Version 4.0 eingeführt, die mindestens bis 1998 zurückreicht. Ich denke, sie war in irgendeiner Form seit mindestens 2.2.36 im Linux-Kernel. Linux Github Logs berichtet am 1. Oktober 2006, als der NTP-Code in eine eigene Datei ntp.cim Kernel getrennt wurde. Aber natürlich ist es von früher da.

Insgesamt ist nichts davon neu.

  1. Wie wird der Zykluszähler verwendet, da er meines Wissens keinen Interrupt liefert und der Nanokernel den Prozessorregistrierungswert, der den aktuellen Zähler enthält, kontinuierlich liest?

Es verwendet dies wie jedes andere Programm, das eine Programmvariable lesen würde. Wenn der verwendete Code ausgeführt wird und der Wert benötigt wird, z. B. weil er neue Informationen zurückerhalten hat, liest er die Variable und aktualisiert sie. Wenn jemand die Zeit haben muss, verwendet er sie auch in dieser Berechnung. Also, es sei denn, der Code wurde wirklich dumm geschrieben (und ich bin mir ziemlich sicher, dass dies nicht der Fall war), nein, er liest den Prozessorregistrierungswert nicht mehr "kontinuierlich" als nötig.

  1. Ändert NTPD jemals die CPU-Taktfrequenz oder verwaltet es nur einen Software-Takt, bei dem die berechnete Taktanpassung angewendet wird?

Es wird der Systemaufruf adjtime () verwendet, der bis vor 1998 zurückreicht. Adjtime sorgt dafür, dass der Taktzähler in regelmäßigen Abständen ein Inkrement zum Verlangsamen verpasst oder um mehr als 1 erhöht, um zu beschleunigen.

felsig
quelle
"Wie wir eine Genauigkeit erzielen können, die größer ist als die Genauigkeit der Systemuhr" -> Da es sich bei der Systemuhr um eine Software-Abstraktion handelt, gibt es im Kernel-Code einige Möglichkeiten, eine wesentlich höhere Auflösungszeit ohne externe Quelle (Atomuhr usw.) zu erzielen ) - Immerhin behält es diesen Software-Tick bei, und es tut es nicht willkürlich. Vermutlich ist die Basis dafür die CPU-Frequenz, die oft im Nanosekundenbereich liegt.
Goldlöckchen
1
@goldilocks ja, ich denke das passiert auch. Nachdem NTP eine Weile ausgeführt wurde, wird die "Drift" der Systemuhr abgelesen. Damit wird die zukünftige Zeit vorhergesagt. Sie benötigen jedoch noch etwas genaueres, um die Kalibrierung zu erhalten. (Nun, nicht wirklich: Sie könnten diesen Wert einfach aus ganzem Stoff zusammenstellen und ihn in die "Drift" -Datei von ntp einfügen, die er liest.)
Rocky