Speicheradresse
Speicheradressen dienen zur eindeutigen Bezeichnung von Speicherzellen im Hauptspeicher eines Computers. Sie werden beim Speicherzugriff verwendet, um den genauen Ort zu benennen, auf den der Zugriff erfolgt. Die Spezifika der Adressierung hängen jeweils von der konkreten Hardware ab und sind nicht standardisiert.
Speicheradressen beginnen typischerweise bei Null und werden i. d. R. aufsteigend und fortlaufend durchnummeriert. Sie werden meist als vorzeichenlose Integer-Zahl und in hexadezimaler Schreibweise angegeben.
Logische und physische Adressen
Man unterscheidet:
Die logische Adresse ist die, die ein Programm „sieht“. Durch die Memory Management Unit werden diese logischen Adressen auf physische Adressen abgebildet. Diese Abbildung ist im Allgemeinen für jeden Prozess unterschiedlich und für den Prozess transparent. Damit ist es möglich, dass mehrere Prozesse die gleichen logischen Adressen verwenden, aber dabei auf unterschiedliche physische Adressen zugreifen.
Auch ist es möglich, einem Prozess mehr logischen Speicher zuzuteilen, als physisch vorhanden ist. Beim Zugriff auf die physisch nicht vorhandenen Speicherbereiche löst die CPU automatisch eine Ausnahme aus, welche vom Betriebssystem abgefangen wird. Das Betriebssystem kann dann zusätzlichen Speicher bereitstellen, indem es beispielsweise andere Speicherbereiche auf die Festplatte auslagert. Diese Technik wird Virtuelle Speicherverwaltung genannt.
Bestimmte physische Adressbereiche können aber in mehreren Prozessen im logischen Adressraum eingeblendet werden. Diese Technik wird auch Shared Memory genannt und ist eine Form der Interprozesskommunikation.
Segmentierte Adressen
Eine Besonderheit stellen Speicheradressen dar, bei denen zu einer Basisadresse ein Versatz in Form eines ganzzahligen Wertes – auch Offset genannt – addiert wird.
- Bei der Segmentierung im Real Mode der x86-Prozessorfamilie wird eine Speicherstelle angegeben nach dem Schema
Segment:Offset
. Die echte Adresse lässt sich berechnen als:
- Im Protected Mode lässt sich die Startadresse des Segmentes aus dem Segment selector ermitteln. Zu dieser Segmentstartadresse wird dann der Offset addiert, um eine lineare logische Speicheradresse zu erhalten.