Der Martin: C - speichersparen/ansatz

Beitrag lesen

Hi,

»» Haben die heutigen 64bit-CPUs (also IA64) einen 64bit-Adressbus, oder "nur" 64bit Datenbreite? Theoretisch müssten sie auch 64bit-Adressen haben, ...
Das ging aber beim 8088 auch mit schmalem Bus. Der hatte dann eben für jede Adresse zwei Ladezyklen. Der Speichercontroller hatte dann wieder 20 (sic!) Bit Breite.

ja, stimmt. Trotzdem hatte diese CPU "im Prinzip" einen 20bit-Adressbus, ebenso wie ein 8051 einen 16bit-Adressbus hat (von denen das höherwertige Byte im Multiplex mit dem Datenbus "rauskommt"), und Spar-CPUs wie der 386SX einen 32bit-Adressbus, der aber auch nur auf 16 Pins herausgeführt ist. Ich spreche vom internen, "logischen" Adressbus, der mit der äußeren physikalischen Beschaltung nicht identisch sein muss.

Dass der erreichbare Speicherraum für eine geschlossene Struktur erstmal von der Registerbreite abhängig ist, ist logisch. Für den Segmentanteil gibt es ja im Protected Mode keine wirkliche Segmentadresse, sondern einen Deskriptor.

... der seinerseits die physikalische Basisadresse und die Länge des Segments enthält.

Darüber kann man also nicht mehr durch den zugewiesenen Speicherbereich wandern, weil jeder Descriptor einen anderen Speicherbereich signiert.

Ja, das stimmt natürlich. Es ist aber gängige Praxis auf 32bit-Systemen, dass der virtuelle Adressraum, der der Anwendung zur Verfügung gestellt wird, in sich nicht mehr segmentiert ist und durchgehend mit einer linearen 32bit-Adresse erreichbar ist. Die Segmentregister sind dabei tatsächlich tabu für den Programmierer - ich meine tabu in dem Sinn, dass er damit auf keinen Fall Zeiger-Berechungen anstellen kann, wie es in der segmentierten 16bit-Umgebung (Real Mode) dieser CPUs gang und gäbe war.

Wenn der Compiler nun größere Blöcke allokieren wollte, müsste er sich dafür mehrere Deskriptoren besorgen, die im einfachsten Falle nebeneinanderliegende Speicherbereiche beschreiben.

Das wäre aber unerheblich: Der Compiler (und auch die Anwendung) kann und darf keine Annahmen über die tatsächliche Lage von Speicherblöcken im RAM machen. Ja, es kann sein, dass zwei Descriptoren tatsächlich zwei Bereiche beschreiben, die im RAM physikalisch lückenlos hintereinander liegen. Das weiß aber nur das Betriebssystem, nicht die Anwendung, und daher kann man aus dieser Tatsache (oder Annahme) keinen Nutzen ziehen, man muss die zwei Bereiche als vollständig getrennt und unabhängig betrachten.

So long,
 Martin

--
Ein guter Lehrer muss seinen Schülern beibringen können,
eine Frage so zu stellen, dass auch der Lehrer lernen muss,
um die Frage beantworten zu können.
  (Hesiod, griech. Philosoph, um 700 v.Chr.)