A20-Linie - A20 line

Der hohe Speicherbereich ist im Realmodus auf 80286-Prozessoren nur verfügbar, wenn das A20-Gate aktiviert ist.

Die A20 oder Adressleitung 20 ist eine der elektrischen Leitungen, die den Systembus eines x86- basierten Computersystems bilden. Über die Leitung A20 wird insbesondere das 21. Bit auf dem Adressbus übertragen .

Ein Mikroprozessor hat typischerweise eine Anzahl von Adressleitungen, die gleich dem Logarithmus zur Basis zwei seines physikalischen Adressraums ist . Ein Prozessor mit 4 GB Byte-adressierbarem physischen Speicherplatz benötigt beispielsweise 32 Leitungen, die mit A0 bis A31 bezeichnet werden. Die Leitungen sind nach der nullbasierten Nummer des Bits in der Adresse benannt, die sie übertragen. Das niedrigstwertige Bit steht an erster Stelle und wird daher mit Bit 0 nummeriert und auf Leitung A0 signalisiert. A20 überträgt Bit 20 (das 21. Bit) und wird aktiv, sobald die Adressen 1 MB oder 2 20 erreichen .

Überblick

Die Prozessoren Intel 8086 , Intel 8088 und Intel 80186 hatten 20 Adressleitungen, die von A0 bis A19 nummeriert waren; mit diesen kann der Prozessor auf 2 20 Byte oder 1 MB zugreifen . Interne Adressregister solcher Prozessoren hatten nur 16 Bit. Um auf einen 20-Bit-Adressraum zuzugreifen, wurde eine externe Speicherreferenz aus einer 16-Bit- Offset- Adresse gebildet, die zu einer 16-Bit- Segmentnummer hinzugefügt und um 4 Bit verschoben wurde, um eine physikalische 20-Bit-Adresse zu erzeugen. Die resultierende Adresse ist gleich Segment × 16 + Offset . Es gibt viele Kombinationen von Segment und Offset, die dieselbe physikalische 20-Bit-Adresse erzeugen. Daher gab es verschiedene Möglichkeiten, dasselbe Byte im Speicher zu adressieren. Hier sind zum Beispiel vier der 4096 verschiedenen Segment:Offset-Kombinationen, die alle auf das Byte verweisen, dessen physikalische Adresse 0x000FFFFF ist (das letzte Byte in 1 MB-Speicherbereich):

F000:FFFF
FFFF:000F
F555:AAAF
F800:7FFF

Auf die letzte Weise referenziert, ergibt eine Erhöhung des Offsets um eins F800:8000, was eine richtige Adresse für den Prozessor ist, aber da sie in die physikalische Adresse 0x00100000 (das erste Byte über 1 MB) übersetzt wird, würde der Prozessor eine andere Adresse benötigen Zeile für den tatsächlichen Zugriff auf dieses Byte. Da es in der 8086-Prozessorreihe keine solche Zeile gibt, wird das 21. Bit darüber, während es gesetzt ist, verworfen, was dazu führt, dass die Adresse F800:8000 "umläuft" und tatsächlich auf die physikalische Adresse 0x00000000 zeigt.

Als IBM die Maschine IBM PC AT (1984) entwarf , entschied es sich, den neuen, leistungsfähigeren Intel 80286- Mikroprozessor zu verwenden. Der 80286 kann im geschützten Modus bis zu 16 MB Systemspeicher adressieren . Die CPU sollte jedoch das Verhalten eines 8086 im Real-Modus , dem Startmodus, emulieren , damit sie Betriebssysteme und Programme ausführen konnte, die nicht für den geschützten Modus geschrieben wurden. Der 80286 zwang die A20-Leitung im Real-Modus jedoch nicht auf Null. Daher würde die Kombination F800:8000 nicht mehr auf die physikalische Adresse 0x00000000 verweisen, sondern auf die Adresse 0x00100000. Als Ergebnis würden Programme, die auf den Adressumbruch angewiesen sind, nicht mehr funktionieren. Um mit solchen Programmen kompatibel zu bleiben, beschloss IBM, das Problem auf dem Motherboard zu beheben .

Dies wurde durch Einfügen eines Logikgatters auf der A20-Leitung zwischen Prozessor und Systembus erreicht, das den Namen Gate-A20 erhielt . Gate-A20 kann per Software aktiviert oder deaktiviert werden, um zuzulassen oder zu verhindern, dass der Adressbus ein Signal von A20 empfängt. Es ist für die Ausführung älterer Programme, die auf den Wrap-Around angewiesen sind, auf non-passing gesetzt. Beim Booten aktiviert das BIOS Gate-A20 zuerst, wenn es den gesamten Systemspeicher zählt und testet, und deaktiviert es dann, bevor es die Kontrolle an das Betriebssystem übergibt.

Ursprünglich war das Logikgatter ein Gatter, das mit dem Intel 8042- Tastaturcontroller verbunden war. Die Kontrolle war ein relativ langsamer Prozess. Seitdem wurden andere Methoden hinzugefügt, um ein effizienteres Multitasking von Programmen zu ermöglichen, die diesen Wrap-Around mit Programmen erfordern, die auf den gesamten Systemspeicher zugreifen. Es gibt mehrere Methoden, um die A20-Linie zu steuern.

Das Trennen von A20 würde nicht alle Speicherzugriffe über 1 MB umschließen, nur die in den Bereichen 1–2 MB, 3–4 MB, 5–6 MB usw. Real-Mode- Software kümmerte sich nur um den Bereich knapp über 1 MB, daher reichte die Gate-A20-Linie.

Das Aktivieren der Gate-A20-Linie ist einer der ersten Schritte, die ein x86- Betriebssystem im geschützten Modus beim Booten ausführt, oft bevor die Kontrolle vom Bootstrap an den Kernel übergeben wurde (z. B. im Fall von Linux).

Der virtuelle 8086-Modus , der mit dem Intel 80386 eingeführt wurde , ermöglicht die Simulation des A20-Wrap-Arounds unter Verwendung der virtuellen Speichereinrichtungen des Prozessors; physischer Speicher kann mehreren virtuellen Adressen zugeordnet werden. Somit kann der im ersten Megabyte des virtuellen Speichers abgebildete Speicher erneut im zweiten Megabyte des virtuellen Speichers abgebildet werden. Das Betriebssystem kann Änderungen an Gate A20 abfangen und entsprechende Änderungen am Adressraum des virtuellen Speichers vornehmen, was auch die Effizienz des Umschaltens der Gate-A20-Leitung irrelevant macht.

A20 Tor

Die Steuerung der A20 - Leitung war ein wichtiges Merkmal in einem Stadium in der Entwicklung der IBM - PC - Architektur, da sie den Zugang zu zusätzlichem 65.520 Bytes hinzugefügt (64 KB - 16 Bytes) des Speichers in real - Modus , ohne wesentliche Software - Änderungen.

In einem wohl "Hack" war das A20-Gate ursprünglich Teil des Tastatur-Controllers auf dem Motherboard, der es je nach gewünschtem Verhalten öffnen oder schließen konnte.

Das A20 Gate ist auf vielen modernen PCs noch vorhanden und das Gate wird zunächst direkt nach dem Booten geschlossen. Moderne Protected-Mode- Betriebssysteme öffnen das A20-Gate typischerweise früh während des Bootvorgangs und schließen es nie wieder. Solche Betriebssysteme haben nicht die Kompatibilitätsgründe, sie geschlossen zu halten, und sie erhalten durch Öffnen Zugriff auf den gesamten Bereich der verfügbaren physischen Adressen.

Der Intel 80486 und der Pentium fügten einen speziellen Pin namens A20M# hinzu , der, wenn er niedrig bestätigt wird, Bit 20 der physischen Adresse für alle Cache- oder externen Speicherzugriffe auf dem Chip auf Null setzt. Dies war notwendig, da der 80486 einen On-Chip-Cache einführte und somit eine Maskierung dieses Bits in der externen Logik nicht mehr möglich war. Software muss immer noch das Gate manipulieren und muss dafür immer noch mit externer Peripherie (dem Chipsatz ) umgehen .

Die Unterstützung für das A20-Gate wurde in der Nehalem-Mikroarchitektur geändert (einige Quellen behaupten fälschlicherweise, dass die A20-Unterstützung entfernt wurde). Anstatt dass die CPU über einen dedizierten A20M#-Pin verfügt, der das Signal empfängt, ob das A20-Bit maskiert werden soll oder nicht, wurde sie virtualisiert, sodass die Informationen von der Peripheriehardware unter Verwendung spezieller Buszyklen an die CPU gesendet werden. Aus Softwaresicht funktioniert der Mechanismus genau wie zuvor, und ein Betriebssystem muss noch externe Hardware programmieren (die wiederum die oben erwähnten Buszyklen an die CPU sendet), um die A20-Maskierung zu deaktivieren.

Intel unterstützt das A20-Gate nicht mehr, beginnend mit Haswell . Seite 271 des Intel System Programmers Manual Vol. 3A vom Juni 2013 heißt es: „Die Funktionalität von A20M# wird hauptsächlich von älteren Betriebssystemen und nicht von modernen Betriebssystemen genutzt. Bei neueren Intel 64-Prozessoren kann A20M# fehlen.“

A20-Handler

Der A20-Handler ist eine IBM PC- Speichermanager- Software, die den Zugriff auf den High-Memory-Bereich (HMA) steuert . Extended-Memory- Manager stellen diese Funktionalität normalerweise bereit. A20-Handler sind nach der 21. Adresszeile des Mikroprozessors, der A20-Leitung, benannt.

In DOS haben HMA-Manager wie HIMEM.SYS die "zusätzliche Aufgabe", A20 zu verwalten. HIMEM.SYS stellte eine API zum Öffnen/Schließen von A20 bereit . DOS selbst könnte den Bereich für einige seiner Speicheranforderungen nutzen und dadurch mehr konventionellen Speicher für Programme freigeben. Diese Funktionalität wurde durch die Anweisungen DOS=HIGHoder HIDOS=ONin der Konfigurationsdatei CONFIG.SYS aktiviert .

Betroffene Programme

Seit 1980 wurde die Adresse Wrap intern verwendet , von 86-DOS und MS-DOS , die zu implementieren CP / M -Stil CALL - 5 Einstiegspunkt im Programm Segment Prefix (PSP) (die zum Teil CP / M gleicht Null Seite ). Dies war vor allem genutzt von Programmen maschinen übersetzt von CP / M-80 durch Übersetzer Assemblersprache wie Seattle Computer Products ' TRANS86 . Die CALL - 5 - Handler dieser Einspeisepunkt an den physikalischen Adresse zu 0x000000C0 wohnt verweist (überlappend auf den Eintrag für INT 30h und das erste Byte INT 31h in der Real - Mode - Interrupt - Vektor - Tabelle ). Durch das Design von CP/M-80 könnte jedoch die 8080 / Z80 16-Bit-Zieladresse, die bei Offset 6 in der Nullseite gespeichert ist, bewusst auch als Segmentspeichergröße interpretiert werden. Um dies in DOS mit seinem 8086-Segment:Offset-Adressierungsschema zu emulieren, musste der 16-Bit-Offset des fernen Call-Einstiegspunkts dieser Segmentgröße (z CALL 5. Die einzige Möglichkeit, diese Anforderungen in Einklang zu bringen, bestand darin, einen Segmentwert zu wählen, der, wenn er zu 0xFEF0 addiert wird, zu einer Adresse von 0x001000C0 führt, die bei einem 8086 auf 0x000000C0 umbrochen wird.

A20 musste deaktiviert werden, damit der Wraparound auftritt und DOS-Programme, die diese Schnittstelle verwenden, funktionieren. Neuere DOS-Versionen, die Teile von sich selbst in den HMA verlagern können, erstellen normalerweise eine Kopie des Einstiegspunkts bei FFFF:00D0 im HMA (der wiederum in das physische 0x001000C0 aufgelöst wird), sodass die Schnittstelle unabhängig vom Zustand von A20 funktionieren kann .

Ein Programm, von dem bekannt ist, dass es die CALL 5-Schnittstelle verwendet, ist die DOS-Version des Small-C- Compilers. Auch das SPELL-Dienstprogramm in Microsofts Word 3.0 (1987) ist eines der Programme, die abhängig von der CALL 5-Schnittstelle entsprechend einzurichten sind. Sun Microsystems ' PC-NFS (1993) erfordert die CALL 5 fix-up auch.

Um Programmplatz zu sparen, wurde von einigen BIOS- und DOS-Programmierern beispielsweise ein Trick verwendet , um ein Segment zu haben, das Zugriff auf Programmdaten hat (z. B. von F800:0000 bis F800:7FFF, das auf die physikalischen Adressen 0x000F8000– 0x000FFFFF) sowie die E/A-Daten (wie der Tastaturpuffer), die sich im ersten Speichersegment befanden (mit den Adressen F800:8000 bis F800:FFFF, die auf die physikalischen Adressen 0x00000000 bis 0x00007FFF zeigen).

Dieser Trick funktioniert so lange, wie der Code nicht im Low Memory ausgeführt wird , den ersten 64 KB RAM, eine Bedingung, die in älteren DOS-Versionen ohne Load-High-Fähigkeiten immer zutraf.

Mit der Verlagerung des DOS-Kernels in höhere Speicherbereiche wurde zunehmend weniger Speicher für Programme zur Verfügung, so dass diejenigen, die auf den Wraparound angewiesen waren, scheiterten. Die ausführbaren Lader in neueren DOS-Versionen versuchen, einige gängige Typen betroffener Programme zu erkennen und sie entweder on-the-fly zu patchen, damit sie auch bei geringem Speicher funktionieren, oder sie laden sie über die ersten 64 KB, bevor sie die Ausführung an sie weitergeben. Bei Programmen, die nicht automatisch erkannt werden, kann mit LOADFIX oder MEMMAX  -L das Laden von Programmen oberhalb der ersten 64 KB erzwungen werden.

Der Trick wurde sowohl von IBM/Microsoft Pascal selbst als auch von damit kompilierten Programmen verwendet, darunter Microsofts MASM . Andere häufig verwendete Entwicklungsprogramme, die dies verwenden, waren ausführbare Kompressoren wie Realias Spacemaker (geschrieben von Robert BK Dewar im Jahr 1982 und verwendet, um frühe Versionen der Norton Utilities zu komprimieren ) und Microsofts EXEPACK (geschrieben von Reuben Borman im Jahr 1985) sowie das entsprechende /E [XEPACK]-Option in Microsofts LINK 3.02 und höher. Programme, die mit EXEPACK verarbeitet werden, zeigen die Fehlermeldung "Gepackte Datei ist beschädigt" an.

Es gibt verschiedene Dienstprogramme von Drittanbietern, um komprimierte ausführbare Dateien zu ändern, indem sie entweder die problematische(n) Dekomprimierungsroutine(n) ersetzen oder versuchen, die Originaldatei zu erweitern und wiederherzustellen.

Moderne Legacy-BIOS- Bootloader (wie GNU GRUB ) verwenden die A20-Linie. UEFI-Bootloader verwenden den 32-Bit- geschützten Modus oder den 64-Bit- Long-Modus .

Siehe auch

Verweise

Weiterlesen