Die Hardware-Uhr

Jeder PC besitzt eine Hardware-Uhr, die batteriegepuffert auch dann weiterläuft, wenn der Rechner ausgeschaltet ist. Diese Hardware ist meistens in einem eigenen Chip zusammen mit dem CMOS-RAM untergebracht, z.B. in einem Motorola MC146818 oder einem Dallas Semiconductor DS12887.

Diese Uhren-Chips stellen die Zeit als Jahr, Monat, Tag, Stunde, Minute und Sekunde dar und werden auch als Real-Time-Clock (RTC) bezeichnet.

Sie erhalten eine von einem Quarz erzeugte Taktfrequenz, die sie durch Teilerstufen schicken, um den Sekundentakt zu generieren, mit dem die Uhr die Sekunden zählt. Beim MC146818 z.B. beträgt die externe Taktfrequenz 4.194304 MHz, die in einer Teilerstufe mit dem Teiler 4 und dann in 4 weiteren Teilerstufen durch jeweils 32 geteilt wird (4 * 324 = 4194304). Der DS12887 hat den Quarz schon im Chip eingebaut.

Diese Hardware-Uhr besitzt aber einige Eigenschaften, die sie als Systemzeit für den Rechner unbrauchbar werden lassen:

  1. Die Auflösung beträgt nur 1 Sekunde
  2. Meistens läuft die Uhr aufgrund billiger Quarze ungenau und es gibt keine Möglichkeit, ihre Ganggeschwindigkeit mit einer externen Referenz (z.B. einem Funkuhrempfänger) nachzuregeln.

Oft wird die Hardware-Uhr auf die "lokale Zeit" gestellt, was aber nicht unbedingt die beste Lösung darstellt:

  1. In der Hardware-Uhr gibt es keine Information über die Zeitzone, deren Zeit sie enthält.
  2. Manche Hardware-Uhren (z.B. MC146818 und DS12887) sind zwar in der Lage, automatisch beim Wechsel Winterzeit/Sommerzeit die Uhr umzustellen, aber sie beherrschen nur die Sommerzeitregeln der USA. Am ersten Sonntag im April um 2:00 Uhr Ortszeit wird die Uhr eine Stunde auf 3:00 Uhr vorgestellt, am letzten Sonntag im Oktober um 2:00 Uhr wieder um eine Stunde auf 1:00 Uhr zurück. In der mitteleuropäischen Zeit gelten aber andere Regeln. Der Wechsel von Winter- auf Sommerzeit ist am letzten Sonntag im März (von 2:00 auf 3:00). Der Wechsel zurück zur Winterzeit findet seit 1996 am letzten Sonntag im Oktober statt (von 3:00 auf 2:00). Bis einschließlich 1995 war es am letzten Sonntag im September. Vor 1980 waren die Umstellung unregelmäßiger und nicht einheitlich in Europa.

Auch das automatische Umstellen der Hardware-Uhr durch das Betriebssystem funktioniert nicht einwandfrei, zumindest nicht, wenn man mehrere Betriebssysteme parallel auf seinem Rechner hat (z.B. Linux, FreeBSD und GNU Hurd. Oder gibt's noch andere, die in Frage kommen? :-)

Dabei würde man nämlich so vorgehen, daß sich das Betriebssystem in einer Konfigurationsdatei merkt, wie die Hardware-Uhr eingestellt ist. Wenn es beim Booten feststellt, daß die augenblickliche Zeit laut der lokalen Regeln Sommerzeit sein muß und die Konfigurationsdatei sagt, daß die Hardware-Uhr noch auf Winterzeit steht, wird sie umgestellt und dies in der Konfigurationsdatei vermerkt. Dieses Verfahren geht aber daneben, wenn jedes Betriebssytem beim ersten Booten nach dem Wechsel auf Sommerzeit die Hardware-Uhr um eine Stunde vorstellt.

Das einzig Wahre ist also, die Hardware-Uhr auf eine Zeitzone ohne solche Wechsel zu stellen, also auf die weltweit einheitliche Zeit, die z.B. auch in der internationalen Fliegerei und Schiffahrt benutzt wird: UTC.

Damit kommen zwar die Betriebssysteme von M$ nicht gut klar, but, hey, who needs M$ Windows anyway? Schließlich hat Billy es uns selbst gesagt:

"Nobody will ever need more than 640k RAM!" (Bill Gates)

"Windows 95 needs at least 8 MB RAM." (Bill Gates)

Logische Schlußfolgerung: Niemand braucht M$ Windows.

Weitere Fähigkeiten, die die Hardware-Uhr bietet, sind z.B. Einstellen von Alarmzeiten, zu denen ein Interrupt ausgelöst wird, oder das periodische Generieren von Interrupts mit Frequenzen von 2 Hz bis 8192 Hz.

Unter Linux kann man mit einem device driver auch auf die Hardware-Uhr zugreifen, und zwar auf /dev/rtc und mit den in rtc(4) beschriebenen ioctl(2)s, sobald die man page existiert :-) Bis dahin guckt man einfach in /usr/src/linux/include/linux/mc146818rtc.h oder /usr/src/linux/Documentation/rtc.txt nach.

Außerdem gibt ein tool aus dem util-linux-2.9-Paket, das diesen device driver nutzt, um die Hardware-Uhr auszulesen und zu setzen. Dieses Programm heißt hwclock und ist in der entsprechenden man page beschrieben. hwclock ersetzt das ältere Programm clock aus util-linux, das die gleiche Funktionalität hatte.