Timer im Kernel

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Rund um den Kernel ‹ Timer im Kernel


Review.png Review: Dieser Artikel ist für das Review freigegeben.


Jeder, der Kernel selbst konfiguriert und baut, hat sich wahrscheinlich schon gewundert, warum es so viele unterschiedliche Timer/Zeitquellen im Kernel gibt. Die Hardware eines modernen Rechners bietet davon ein ganze Menge an. Der Artikel soll einen kleinen Überblick geben, was es gibt und was es nützt. Er bezieht sich auf x86-Systeme, wenn nicht anderweitig eingeschränkt. Wenn Angaben zur Kernel-Konfiguration gemacht werden, dann ist von der Version 2.6.24 oder neuer die Rede. Einige Punkte finden sich aber auch in älteren Versionen, da der Übergang zwischen solchen Subsystemen nie innerhalb einer Version stattfindet, sondern lange Zeit parallel abläuft.

Natürlich besteht kein Zweifel, dass Zeitangaben und -messungen absolut unerlässlich sind. Eigentlich würde nichts ohne Zeitmessung funktionieren, nicht mal das Abspielen simpler Audio-Dateien. Oder der Zugriff auf externe Schnittstellen, das Netzwerk, das Steuern der Grafikausgabe.

Bei älteren Rechnern war das auch alles noch nicht so kritisch. Die Frequenz, mit der ein Prozessor getaktet wurde, war klein im Vergleich zur verfügbaren Auflösung der damals vorhandenen Timer-Hardware. Auch die Zugriffszeiten auf Hardware, die eine Zeitinformation zur Verfügung stellt, waren vergleichsweise klein im Bezug zu den Zeitschritten des Kernels. Genaues Timing war also kein Problem. Mit steigenden Taktfrequenzen hat sich dieses Verhältnis aber immer weiter verschlechtert, also mussten neue Techniken, neue Hardware eingeführt werden.

Im Prinzip sind alle unten erwähnten Timer in Hardware ausgeführt, aber schon das Wo ist entscheidend. Auf dem Prozessor, North-/Southbridge, irgendwo auf dem Board als dedizierter Baustein. Das ist vergleichbar mit dem Zugriff auf die unterschiedlichen Speichertypen wie L1/L2/L3-Cache, RAM und Festplatte. Es dauert mehr oder weniger lange und ist somit ein wichtiges Kriterium für die zeitliche Auflösung.



RTC

Die real time clock wird fast jeder kennen. Das ist der einzige Chip auf einem Board, der auch bei abgeschalteten Rechner durch eine Batterie mit Strom versorgt wird und die aktuelle Uhrzeit und das Datum bereithält (heute meist im Chipsatz integriert). Manche RTC-Bausteine stellen gleich den ebenfalls Batterie-gepufferten CMOS-Speicher für die BIOS-Einstellungen zur Verfügung. Wenn im BIOS die Uhrzeit eingestellt wird, dann stellt man die RTC ein. Die RTC speichert und pflegt aber nicht nur die Uhrzeit sondern stellt auch periodisch Interrupte für das Betriebssystem zur Verfügung. Da das ein dedizierter (sprich: alleinstehender) Chip ist, dauert der Zugriff aus dem Betriebssystem darauf recht lange.

Einstellmöglichkeiten im Kernel

Da sind seit einiger Zeit zwei unterschiedliche Abschnitte (Treiber) in der Kernel-Konfiguration. Einerseits der Bekannte, auch als legacy-Treiber bezeichnete RTC, der sich in der Kategorie Character devices befindet. In neueren Kerneln separat unter Real Time Clock. Der entsprechende Punkt heißt Enhanced Real Time Clock Support und der Treiber erstellt das Gerät /dev/rtc. Dieser hat fast nur in der x86-Welt Bedeutung. Erst seit kurzem vorhanden ist das Subsystem RTC_CLASS, welches viel mehr unterschiedliche Hardware-Varianten unterstützt und wesentlich moderner ist. Es vereinfacht mit einer einheitlichen Schnittstelle den Zugriff auf solche Bausteine und macht auch das Hinzufügen von neuen Chip-Treibern leichter. Es beseitigt auch einige alte Probleme, die der RTC-Treiber verursacht hat, beispielsweise konnte auf PC-Systemen immer nur eine Echtzeituhr genutzt werden, auch wenn mehrere vorhanden waren. Das Subsystem befindet sich als eigene Kategorie Real Time Clock in Device Drivers. Für PCs ist dann der Unterpunkt PC-style CMOS auszuwählen.

Empfohlen wird der Einsatz des neueren Systems, da absehbar ist, dass der legacy-Treiber über kurz oder lang als obsolete gekennzeichnet wird.


8254/PIT

Wichtiger als die RTC und auch etwas älter ist der PIT - Programmable Interval Timer. Die alternative Bezeichnung 8254 bezeichnet dabei einen Baustein der Fa. Intel. Grundlegende Funktionen wie Taktung und Refresh-Steuerung des Speichers werden von ihm auch gesteuert. Der Baustein war auch lange Zeit der zentrale Zeitgeber für Linux. Er hat allerdings die gleichen Probleme wie die RTC. Früher ein extra Chip, heutzutage in der Southbridge, kostet der Zugriff viel Zeit. Somit fällt auch dieser für genauere Zeitmessungen raus.

Einstellmöglichkeiten im Kernel

Der PIT hat keinen eigenen Platz in der Kernel-Konfiguration, da er - zumindest auf PC-Systemen - standardmäßig verwendet wird. Der weiter unten angesprochene HPET ist allerdings als Ersatz gedacht und übernimmt auch die Rolle des PIT, wenn auf der jeweiligen Hardware vorhanden.


PM Clock (ACPI)

Der ACPI-Timer (ACPI: Advanced Configuration and Power Interface, nicht zu Verwechseln mit dem APIC: Advanced Programmable Interrupt Controller) ist eine im Chipsatz bereitgestellte Funktion, die das Betriebssystem (und die Hardware) nutzen kann. Das wichtigste Ziel beim Entwurf dieses Timers waren zuverlässige Zeitstempel, die unabhängig von der Prozessorgeschwindigkeit sind, und andererseits möglichst schnell auslesbar sein sollten.

Einstellmöglichkeiten im Kernel

Für den Timer gibt es keine alleinstehende Einstellmöglichkeit im Kernel, ist das System ACPI-kompatibel kann man in der Kategorie Power managment options den ACPI-Support anschalten, der auch die Nutzung des PM-Timers einschließt. Das sollte auf allen neueren PC-Systemen möglich sein, allerdings entscheidet oftmals die jeweilige Implementation der Hardware darüber, ob alle Funktionen genutzt werden können.


APIC

Der APIC-Timer (APIC ist unterteilt in I/O-APIC und LAPIC) befindet sich in der Peripherie bzw. der CPU und ist auch für die Koordination von Interrupts zwischen den Kernen einer CPU zuständig. Er ist hauptsächlich auf SMP-System (Mehrprozesssor-Rechner) anzutreffen.

Einstellmöglichkeiten im Kernel

Auf SMP-Systemen wird auch dieses System per Default verwendet und der vorhandene Timer genutzt. Auf UP-Systemen (single prozessor, single core) kann, soweit in Hardware vorhanden, der APIC angeschaltet werden. Dazu befinden sich in der Kategorie Processor type and features der Punkt Local APIC support on uniprocessors und dessen Unterpunkt IO-APIC support on uniprocessors. Allerdings ist die korrekte Funktionalität gerade auf etwas älteren Systemen meist nicht gegeben.


HPET

Nicht zu verwechseln mit dem ACPI-Timer ist der HPET - high precision event timer. Dieser ist ebenfalls nur auf recht aktueller Hardware zu finden und ist eigentlich als Ersatz für PIT und RTC zu verstehen. Sein früherer Name - Multimedia Timer - soll darauf hinweisen, das aktuelle Anwendungen eine höhere Auflösung brauchen, als die sogenannten legacy-Chips (PIT und RTC) liefern können.

Einstellmöglichkeiten im Kernel

Für diese Hardware-Variante gibt es wieder mehrere Punkte in der Kernel-Konfiguration. Zuerst ist der generelle Support in der Kategorie Processor type and features als Unterpunkt HPET Timer Support aufgeführt. Das bewirkt, dass der Kernel den HPET als Quelle für Zeitstempel verwenden kann. Läßt man diesen Punkt weg und schaltet nur die Option HPET - High Precision Event Timer unterhalb Character devices an, kann der Timer vom Userspace aus genutzt werden (zum Beispiel durch den Mplayer).


TSC

Der TSC - time stamp counter - ist ein Timer, der auf jeder neueren CPU (genauer: auf jedem Kern) vorhanden ist, auf x86 und vergleichbaren Plattformen aber seinen Zielen nicht gerecht wird. Sein Zugriff sollte einfach und schnell sein, die TSCs der einzelnen Kerne immer im Sync miteinander. Leider sieht die Praxis anders aus, jedenfalls bis jetzt. Da der TSC direkt auf der CPU sitzt, wird er auch vom Takt selbiger beeinflußt, Ändert die CPU ihren Takt, ändert sich auch der Takt des TSC. Weiterhin kann auf x86-Systemen bis jetzt die Synchronität der TSC zwischen mehreren Kernen nicht garantiert werden.

Einstellmöglichkeiten im Kernel

Da der TSC nur bei bestimmten Prozessoren (Pentium 1 und neuer, sowie kompatible) vorhanden ist, wird er automatisch verwendet, sobald die entsprechende Architektur ausgewählt wird. Allerdings entscheidet der Kernel zur Laufzeit, ob er den TSC als Zeitquelle verwendet.


Verwendete Zeitquellen

Der Kernel stellt diverse Informationen zur Laufzeit bereit, anhand deren man sehen kann, welche Geräte vom Kernel verwendet werden können und welche verwendet werden. Außer dem leicht einsehbaren Ringpuffer (dmesg/syslog) gibt weiterhin noch eine Schnittstelle in /sys/devices/system/clocksource. Da findet sich bei PC-Systemen meistens ein Ordner clocksource0, welcher die Dateien available_clocksource sowie current_clocksource enthält. Erstere zeigt die verfügbaren Zeitquellen, mit letzterer kann eine andere Zeitquelle ausgewählt werden. Allerdings kann das je nach Hardware auch zu Problemen führen.


Links

http://de.wikipedia.org/wiki/Echtzeituhr

http://de.wikipedia.org/wiki/ACPI

http://sdqweb.ipd.kit.edu/wiki/Performance-Messung

http://www.microsoft.com/whdc/system/sysinternals/mm-timer.mspx

http://en.wikipedia.org/wiki/Local_APIC

https://lkml.org/lkml/2005/11/18/261 (veralteter Vergleich)

http://lwn.net/Articles/209101/ (TSC)

https://lkml.org/lkml/2007/7/4/7 (HPET)

http://www.intel.com/hardwaredesign/hpetspec_1.pdf (HPET)

http://ftp.utcluj.ro/pub/users/calceng/PMP/231164.pdf (Intel 8254)