Symmetrisches Multiprozessorsystem — Änderungen 4402 → 4870

Zeile 1: Zeile 1:
 
{{TODO|Dieser Artikel soll erweitert werden}}
 
{{TODO|Dieser Artikel soll erweitert werden}}
−
Ein '''Symmetrisches Multiprozessorsystem''' (='''SMP''') ist ein System mit einem oder mehreren identischen Prozessoren. Im Gegensatz zu [[NUMA]]-Systemen sind alle Prozessoren auf gleiche Art & Weise mit dem Hauptspeicher verbunden, d.h. es gibt für keinen Prozessor einen von der Geschwindigkeit her bevorzugten/benachteiligten Speicherbereich im Hauptspeicher.
+
Ein '''Symmetrisches Multiprozessorsystem''' ('''SMP''') ist ein System mit einem oder mehreren identischen Prozessoren. Im Gegensatz zu [[NUMA]]-Systemen sind alle Prozessoren auf gleiche Art und Weise mit dem Hauptspeicher verbunden, d.h. es gibt für keinen Prozessor einen von der Geschwindigkeit her bevorzugten/benachteiligten Speicherbereich im Hauptspeicher.
  
 
== Intel Multiprocessor Specification ==
 
== Intel Multiprocessor Specification ==
−
 
+
Die ''Intel Multiprocessor Specification'' ist ein Standard für [[x86]]- und [[Long Mode|x86-64]]-basierte, symmetrische Multiprozessorsysteme und ist abwärtskompatibel mit existierenden [[x86]]- und [[x86-64]]-Uniprozessorsystemen. Die Spezifikation beschreibt einerseits die Anforderungen an die Hardware und das [[BIOS]], und andererseits die Schritte, die notwendig sind, um mit einem [[Betriebssystem]] den Geschwindigkeitsvorteil mehrerer Prozessoren nutzbar zu machen.
−
Die ''Intel Multiprocessor Specification'' ist ein Standard für [[x86]]- und [[Long Mode|x86-64]]-basierte, symmetrische Multiprozessorsysteme und ist abwärtskompatibel mit existierenden [[x86]]- und [[x86-64]]-Uniprozessorsystemen. Die Spezifikation beschreibt einerseits die Anforderungen an die Hardware und das [[BIOS]] und andererseits die Schritte die notwendig sind, um mit einem [[Betriebssystem]] den Geschwindigkeitsvorteil mehrerer Prozessoren nutzbar zu machen.
 
  
 
=== Unterteilung der Prozessoren ===
 
=== Unterteilung der Prozessoren ===
Zeile 10: Zeile 9:
  
 
=== Floating Pointer Structure ===
 
=== Floating Pointer Structure ===
−
 
 
Der erste Schritt dahingehend ist das Auffinden der ''Floating Pointer Structure''. Diese Struktur wird vom BIOS erstellt und falls sie existiert ist dieses System zur ''Intel Multiprocessor Specification'' kompatibel.  
 
Der erste Schritt dahingehend ist das Auffinden der ''Floating Pointer Structure''. Diese Struktur wird vom BIOS erstellt und falls sie existiert ist dieses System zur ''Intel Multiprocessor Specification'' kompatibel.  
  
Zeile 21: Zeile 19:
 
<br>
 
<br>
  
−
{|
+
{| {{prettytable}}
 
|-
 
|-
 
! Feld
 
! Feld
Zeile 52: Zeile 50:
  
 
==== Auffinden der Struktur ====
 
==== Auffinden der Struktur ====
−
Die ''Floating Pointer Structure'' wird anhand der 4 Signaturbytes und der Checksumme identifiziert. Die Prüfsumme wird berechnet indem man alle Bytes (inklusive des Feldes ''Checksum'') der Struktur aufaddiert. Das Ergebnis dieser Berechnung muss 0x00 sein. Die Struktur befindet sich in mindestens einem der folgenden Speicherbereiche:
+
Die ''Floating Pointer Structure'' wird anhand der 4 Signaturbytes und der Checksumme identifiziert. Die Prüfsumme wird berechnet, indem man alle Bytes (inklusive des Feldes ''Checksum'') der Struktur aufaddiert. Das Ergebnis dieser Berechnung muss 0x00 sein. Die Struktur befindet sich in mindestens einem der folgenden Speicherbereiche:
 
* In dem ersten Kilobyte der [[Extended BIOS Data Area]]
 
* In dem ersten Kilobyte der [[Extended BIOS Data Area]]
−
* In dem letzten Kilobyte des Hauptspeichers unterhalb der 1MB Marke (Die Größe des Basisspeichers steht an Offset 0x13 in der [[BIOS Data Area]]), wenn die Addresse der Extended BIOS Data Area nicht definiert ist
+
* In dem letzten Kilobyte des Hauptspeichers unterhalb der 1MB Marke (Die Größe des Basisspeichers steht an Offset 0x13 in der [[BIOS Data Area]]), wenn die Addresse der Extended BIOS Data Area nicht definie
 +
rt ist
 
* Im Adressraum des BIOS ROM (0xF0000 - 0xFFFFF)
 
* Im Adressraum des BIOS ROM (0xF0000 - 0xFFFFF)
 
Die Speicherbereiche sind in exakt dieser Reihenfolge zu durchsuchen.
 
Die Speicherbereiche sind in exakt dieser Reihenfolge zu durchsuchen.
Zeile 70: Zeile 69:
  
 
* Der Mutex sei freigegeben (= 0), es kann also ein Prozess in den kritischen Abschnitt eintreten, wenn er den Mutex lockt (d.h. auf 1 setzt)
 
* Der Mutex sei freigegeben (= 0), es kann also ein Prozess in den kritischen Abschnitt eintreten, wenn er den Mutex lockt (d.h. auf 1 setzt)
−
* Nun wollen zwei Threads/Prozesse, die auf verschiedenen CPU's ausgeführt werden, etwa gleichzeitig den Mutex für sich locken
+
* Nun wollen zwei Threads/Prozesse, die auf verschiedenen CPUs ausgeführt werden, etwa gleichzeitig den Mutex für sich locken
 
* Thread #1 auf CPU #1 liest die Speicherstelle = 0
 
* Thread #1 auf CPU #1 liest die Speicherstelle = 0
 
* Thread #2 auf CPU #2 liest ebenfalls die Speicherstelle = 0
 
* Thread #2 auf CPU #2 liest ebenfalls die Speicherstelle = 0
Zeile 80: Zeile 79:
 
Aus diesem Grund wird zur Implementierung die TSL-Instruktion verwendet. Sie ist auch auf SMP-Systemen atomar (vgl. [http://www.intel.com/design/intarch/manuals/243191.htm Intel Spezifikation], S. 3-714), d.h. der sogenannte ''lock''-Präfix wird implizit angenommen, wenn bei der ''xchg''-Instruktion eine Speicherstelle verwendet wird. Der Präfix kann auch explizit angegeben werden - er bewirkt, dass der Speicherbus während der nächsten Instruktion gesperrt wird.
 
Aus diesem Grund wird zur Implementierung die TSL-Instruktion verwendet. Sie ist auch auf SMP-Systemen atomar (vgl. [http://www.intel.com/design/intarch/manuals/243191.htm Intel Spezifikation], S. 3-714), d.h. der sogenannte ''lock''-Präfix wird implizit angenommen, wenn bei der ''xchg''-Instruktion eine Speicherstelle verwendet wird. Der Präfix kann auch explizit angegeben werden - er bewirkt, dass der Speicherbus während der nächsten Instruktion gesperrt wird.
  
−
Ein Beispiel für eine simple 32-bit TSL-Funktion:
+
Ein Beispiel für eine simple 32-Bit-TSL-Funktion:
 
<asm>; uint32_t tsl(uint32_t *ptr, uint32_t newValue)
 
<asm>; uint32_t tsl(uint32_t *ptr, uint32_t newValue)
 
_tsl:
 
_tsl: