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 .
- 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.c
im Kernel getrennt wurde. Aber natürlich ist es von früher da.
Insgesamt ist nichts davon neu.
- 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.
- Ä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.