Die Zahl für heute: 640
Eines der Zitate die man Bill Gates zuschreibt ist dieses: „640K ought to be enough for anybody“, also 640 KByte (RAM) sollten genug für jedermann sein. Bill Gates soll dies 1981 gesagt haben. Zeit dem mal nachzugehen, denn ich denke daran ist dreierlei falsch:
Hat Bill Gates das jemals gesagt?
Schon daran scheitert es. Journalisten finden keine Nachweise für dieses Zitat. Bill Gates selbst hat schon 1990 als das Zitat als Joke kursierte (inzwischen hatten Computer nämlich mehr als 640 KByte Speicher) verneint der Urheber zu sein:
„I’ve said some stupid things and some wrong things, but not that. No one involved in computers would ever say that a certain amount of memory is enough for all time.“ … „I keep bumping into that silly quotation attributed to me that says 640K of memory is enough. There’s never a citation; the quotation just floats like a rumor, repeated again and again.“ (Quelle)
Wie wir alle wissen haben Zitate oft eine Eigendynamik und werden immer wieder zitiert, mir fällt da spontan Gorbatschow ein „Wer zu spät kommt den bestraft das Leben“. Zumindest hat er das gesagt, ein ähnliches Zitat machte er auch öffentlich und das wird ab und an auch gezeigt. Das Zitat hat sich längst von Gorbatschow gelöst und kann immer angewandt werden, wenn jemand eine Entwicklung verschläft oder rückwärtsgerichtet denkt.
Hat Bill Gates überhaupt etwas mit der Grenze zu tun?
Das wird sehr gerne übersehen. Als der IBM PC geschaffen wurde, da war auch vorgesehen, ihn mit Erweiterungskarten zu erweitern. Das entpuppte sich wie zuvor beim Apple II auch als ein sehr wichtiges Kaufargument. Natürlich konnte IBM nicht wissen, welche Karten es geben würde, auch wenn man mit einigen Karten in den Verkauf startete. Wie aber sieht man eine Erweiterung vor, die es gar nicht gibt? IBMs Lösung war das Memory Mapping. Der 8088 Prozessor, ein Abkömmling des 8086, hatte einen Adressraum von 1 MByte. Dieser war aber nicht durchgängig adressierbar. Intel hatte den Prozessor recht überhastet entworfen, und als Kompabilitätsargument zum Vorgänger 8080, ein 8-Bit-Prozessor der 64 KByte adressieren konnte, waren die Register 16 Bit breit. So konnte der 8086 auch nur 64 KByte am Stück adressieren. Auf den Adressraum von 1 MByte kam er mit einem zweiten Satz von Registern, den Segment Registern. Sie verschoben die 64 Kbyte der vier Hauptregister im Adressraum. Dazu verschoben sie die Basisadresse um 4 Bit. Damit konnte jedes der vier Segmente, die es gab, im Adressraum frei platziert werden – fast frei, die Basisadresse musste durch 16 ganzzahlig teilbar sein. Nebenbemerkung: da das Konzept nicht richtig durchdacht war, konnte man ein Segment auch ganz oben im Speicher platzieren und so (unabsichtlich?) auf die ersten 64 KByte über 1 MByte zugreifen. Das nutzen bald Programme, um so den Speicher zu erweitern und Intel musste diesen Fehler „A20 Gate“ noch über Generationen in seine Prozessoren einbauen, selbst wenn diese 4 GByte direkt linear adressieren konnten.
Aufgrund dieser Segmentadressierung lag es nahe, ein Segment als Größe für einen so genutzten Speicherbereich zu reservieren. IBM sah die obersten 64 KByte für das BIOS vor, das jeder Computer braucht. Der 160 KByte große Bereich darunter, beginnend bei 800 KByte war für BIOS Erweiterungen reserviert. Später lagen hier z.B. die BIOS von Netzwerkkarten.
Bei 640 KByte lag der 128 KByte große Bereich für das VideoRAM und darüber der 32 KByte große Bereich für das Video-BIOS. Dieser Bereich erschien anfangs groß, hatten die beiden bei Verkaufsstart verfügbaren Karten doch nur 16 bzw. 32 KByte RAM. Die EGA-Karte die 1984 erschien nutzte ihn aber schon voll aus, und die VGA Karte konnte nur Teile ihres RAM dort einblenden.
Das limitierte den unteren Bereich, der für das Betriebssystem zur Verfügung stand, auf 640 KByte, die berüchtigte 640 K Grenze. Es war aber eine Grenze die IBM zog und nicht MS-DOS, das von Bill Gates Firma programmiert wurde (und auch nicht von ihm, sondern Tim Paterson. Das lief auch auf anderen Computern mit anderen reservierten Bereichen, die dann viel mehr Speicher zur Verfügung stellten. Der Sirius Victor z.B. bis zu 896 KByte.
Konnte man auf dem IBM PC die Grenze ausnutzen?
Auch gerne vergessen wird, dass man den IBM PC anfangs mit 64 KByte Speicher verkaufte. Mit Erweiterungskarten konnte man das erste Modell auf maximal 256 KByte aufrüsten. Die Ausbaugrenze stieg dann beim IBM PC XT mit Karten mit mehr Speicher und mehr Speicher auf dem Mainboard auf die 640 KByte an.
Doch selbst das geht am wahren Problem vorbei. Den die erste Version von MS-DOS war eine Kopie von CP/M. CP/M hatte ein Format für die ausführbaren Dateien eingeführt, das fast den gesamten Speicher adressieren konnte – nur die ersten 256 Byte wurden als Puffer und für Sprungvektoren reserviert (in der Praxis saß natürlich noch das Betriebssystem im Speicher, aber theoretisch konnte ein COM-File 64 KB lang sein. Das wurde bei der ersten Version von MS-DOS 1:1 kopiert und so waren Programme unter MS-DOS auch auf 64 KByte beschränkt. Das war doppelt ärgerlich. Denn so nutzte man nicht nur die Möglichkeit größere Programme zu erstellen, sondern alle Segmente waren übereinander gelagert – selbst bei 64 KByte für das Codesegment gab es ja noch die Segmente für Daten, Stack und das „Extra“-Segment, die man so für andere Zwecke nutzen konnte.
Natürlich konnte jemand ein eigenes Memory-Managment System in dem COM-File implementieren und dieses dann nutzen, um den Speicher besser zu nutzen, doch dann entfernte man sich vom Standard und das war in Zeiten, wo man dies selbst in Assembler programmieren musste, sehr aufwendig, also gab es das kaum. Was Programme machten, war oft, dass sie das Stacksegment und Datensegment verschoben. Der Stack war meist nicht sehr groß, er wurde ja nur für temporäre Wette benutzt, so waren effektiv etwa 128 Kbyte RAM unter MS-DOS 1.0 nutzbar, dazu kam dann noch das RAM, das das Betriebssystem nutzte – ich denke, wer einen IBM PC unter MS-DOS mit 160 KB bestückt hatte, hatte die maximale sinnvolle Ausbaustufe erreicht.
Das änderte sich erst als mit DOS 2.0 das bis heute (wenn auch anderer interner Struktur) genutzte .exe Format eingeführt wurde, das mehrere Segmente unterstützte. Erst damit war die 640-KByte-Grenze eine ausnutzbare Grenze.
Die Grenze entpuppte sich sehr schnell als solche. 1984 erschien der IBM PC AT. Er kam anfangs mit 512 KB auf den Mark, wenig später durch den rapiden Preisverfall der Chips mit 1 MByte. Aufgrund der Adressierung über den Prozessor ergab sich dann aber schon die Problematik. Die oberen 512 KByte konnte man nur durch ein speicherresidentes Programm als Datenhalde für eine RAM-Disk nutzen. So etablierten sich bei kompatiblen Nachbauten gemischte Konfigurationen: zwei Bänke mit 256 KBit Chips, zwei mit 64 KBit Chips, die dann zusammen die berüchtigten 640 KByte ergaben – und diese Computer hatten (unter DOS) dann mehr Speicher als bei einer 1 MByte Bestückung …
Die Grenze blieb solange eine Grenze, wie es MS-DOS gab. Die Marktmacht von MS-DOS bröckelte erst mit Windows 3, das erstmals MS-DOS Programme ausführen konnte, ohne das sie Windows mit zum Absturze bringen konnte und schwand rapide nach Einführung von Windows 95 – dann hatte ein durchschnittlicher Computer aber schon 4 bis 8 MByte RAM von denen MS-DOS nur die ersten 640 KByte nutzte.
Nur 640 KByte?
Nicht ganz. Wie geschrieben gab es zwei Ausflüchte. Das erste war das A20 Gate das es erlaubte knapp 64 KByte oberhalb von 1 MByte zu nutzen. Dazu brauchte man einen Treiber (Himem.sys). Dort lagerte MS-DOS dann Programmteile aus. Später nutzte man auch den Bereich zwischen 640 und 960 KByte, indem MS-DOS scannte, ob sich in diesem Bereich überhaupt BIOSe oder RAM von Adapterkarten befanden, und nutzte ihn ebenfalls zum Auslagern von Code. Beide Maßnahmen vergrößerten aber nicht den unteren Bereich von 640 KByte, sondern reduzierten nur den Bereich, den MS-DOS von diesem Speicher für sich beanspruchte.
Es gab aber die Möglichkeit wirklich den Speicher etwas nach oben zu verschieben. Ab 640 KByte lag das Videoram. Nur begannen die Framebuffer der meisten Karten nicht direkt dort, sondern etwas höher. Die CGA Karte bei 736 KByte, die Hercules Karte bei 704 KByte. Das erlaubte es, wenn man das Betriebssystem modifizierte, die Grenze nach oben zu verschieben und entsprechende Artikel waren in den Achtziger Jahren dann auch Aufmacherthemen bei Computerzeitschriften. Erst mit der EGA-Karte änderte sich das, sie benötigte in der vollen Ausbaustufe den ganzen Speicher. Ab der VGA Karte wurde dann das direkte Adressieren unüblich, sonst hätte man nie mehr als 128 KB Grafikspeicher ansprechen können, stattdessen wurde die Karte über Interruptadressen angesprochen.
Was draus gelernt?
Diese Frage muss man an die IT-Industrie stellen. Denn Grenzen gibt es ja nicht nur beim Betriebssystem. Es gibt sie auch woanders. Festplatten werden z. B. zum einen physikalisch adressiert über Sektornummer, Spurnummer und Zylindernummer, zum andern logisch durch Blocknummern durch das Betriebssystem. Und da habe ich etliche Einschränkungen kennengelernt. Das verdanken wir drei Mitspielern: Kontroller, BIOS und Betriebssystem. Hat eines eine Grenze, so geht nichts mehr. Das ging los 1984 mit der Beschränkung von FAT16 – mehr als 65.536 Blöcke konnte DOS (übrigens bis zu seinem Ende) nie adressieren. Das waren aber damals 512 Byte Sektoren und so schlug bei 32 MByte die erste Grenze zu. Später erlaubte DOS be Version 3 dann andere Blockgrößen sodass DOS mit 32 KByte großen Blöcken bis 2 GByte große Partitionen verwalten konnte (allerdings bei immenser Platzverschwendung, denn jede Datei war dann mindestens 32 KByte groß). Andere Grenzen setzet dann das BIOS (512 MByte bis etwa 1994) oder der Controller. Die letzte Grenze ist noch gar nicht so lange her. Die 4 Milliarden Sektoren reichen bei 512 Byte pro Sektor auch nur bis 2 Terabyte. Als Ausweg hat man die Festplattenadressierung auf die 4-KByte-Blöcke umgestellt die auch Windows und Linux nutzen. Das reicht dann bis 16 Terabyte – uh das wird bald wiederkommen, und den erreicht schon die erste Festplatte. Oder versuchen sie mal auf einen USB-Stick eine Datei mit mehr als 4 Gigabyte Gröpße zu kopieren – dann lernen sie eine weitere Grenze kennen. USB Sticks werden mit FAT32 bzw. ExFat formatiert, einem Nachfolger von FAT32. Der Grund ist relativ einfach. Dieses Dateisystem kennt keine Rechte und Besitzer, anders als NTFS das von Windows genutzt wird oder die Linux Dateisysteme. Sonst könnte Benutzer X bei Computer A nicht auf die Daten von Benutzer Y auf Computer B zugreifen (außer beide haben den gleichen Benutzernamen und Passwort) und das ist bei einem portablen Medium nicht so erwünscht. FAT32 von Windows 95B eingeführt, hat aber eine Größenbeschränkung von 4 KByte pro Datei. Erschienen 1996 4 GB als viel – die größten Festplatten hatten damals diese Größe und das Limit gilt ja nur für eine Datei, nicht die ganze Festplatte, so ist das 24 Jahre später nicht mehr viel. Ein hochauflösender Film oder ein gezipptes Spiel bricht die Grenze leicht.
Die ersten DOS-Versionen haben noch FAT 12 benutzt, so dass die maximale Größe einer Partition 8MB betrug.
CGA-Karten hatten wegen dem Grafikmodus 16KByte RAM, im Textmodus wurden aber nur die ersten 4KByte gebraucht. So konnte man die darüberliegenden 12KByte für Programme nutzen.
Die ersten DOS Version hatten noch gar keine Festplattenunterstützung, sodass man FAT12, das eigentlich für Disketten gedacht ist auch für Festplatten einsetzen musste. FAT16 war das erste Dateisystem für Festplatten.