Allgemeine Fragen zu Paging

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Allgemeine Fragen zu Paging
Ich habe mir noch einmal die Paging Aufgabe aus dem vergangenen Tutorium angesehen, dass ich ein paar Sachen noch nicht perfekt verstanden habe. Ich würde mich freuen, wenn mir jemand weiter helfen kann, Aufgabe s. Anhang.

  1. Die Zahl der Einträge, die eine Page passt, bestimmt wie viele Bits aus einer 4-Byte Addresse/32 bit Addresse ihr zugeordnet werden. Z.b. 64= 2^6 Einträge gleichzeitig möglich sind, bedeutet das, dass 6 bits benötigt werden, um alle virtuellen Addressen ansprechen zu können.

  2. Wenn die Seite Platz für 64 Einträge hat, dann nummeriert man sie von 0x0 bis 0x3f. Im Fall 1024 Einträge, nummeriert man sie von 0x0 bis 0x3ff.

  3. Wie aber bestimmt man den Inhalt? So wie ich verstehe, man wählt die jeweils nächste freie Addresse. In der Paging Aufgabe im Tutorium. Die Adressen der PT begannen an Stelle 0xcf 03 00 00, ab da haben wir dann simpel hochgezählt:
    Dabei haben wir geschrieben:
    0xcf 03 00 00 (gegeben) → 1. Addr. in PT1: 0xcf 03 0101 → 1. Addr. in PT2 → 0xcf 03 01 → PT3. 0x98 76 50 00 (vorgegeben) → PT3. 0x98765805
    Mich interessiert hier:
    a) Warum schreiben wir jeweils an die rot markierte Stelle der Addr. ?
    b) Wie berechnen sich diese Stelle in Betracht der vorher vergebenen Stelle?
    c) Welche Rollen spielen dabei Page Size, Zahl der Einträge und Größe der Einträge?

Attachment:
exercise-01.pdf: https://fsi.cs.fau.de/unb-attachments/post_155092/exercise-01.pdf


richtig.

richtig. Zur Überlegung: Von wo bis wo nummeriert man sie bei 2048 Einträgen?

Das ist abhängig von der Aufgabenstellung/Vergabestrategie des Betriebssystems. Wenn wir ab einer bestimmten Adresse Speicher zur Verfügung haben, dann können wir ab dieser Adresse (unter Einhaltung etwaiger Ausrichtungserfordernissen, die in der Aufgabe aber nicht gegeben waren) einfach den Speicher hintereinander vergeben.

Es existieren 2KiB-Pages. Das heißt Bytes in einer Page können von [m]0x0[/m] bis [m]0x7ff[/m] adressiert werden (entspricht 11 Bytes). Für die zwei Seiten ab [m]0x98765000[/m] bedeutet das, dass die zweite Seite genau [m]0x800[/m] Bytes nach dem Beginn der ersten Page beginnt. [m]0x98765000 + 0x800[/m] ist hierbei eben [m]0x98765800[/m].

Auf die gleiche Art und Weise wurden auch die Adressen der Seitentabellen vergeben. Hierbei muss man aber darauf achten, dass die Seitentabelle der ersten Stufe 256 ([m]0x100[/m]), die der zweiten Stufe 512 ([m]0x200[/m]) und die der dritten Stufe 1024 ([m]0x400[/m]) groß sind. In diesem Fall beginnt die nächste Seitentabelle einfach direkt nach der vorhergehenden.

Im Prinzip kann man den Speicher einfach aufsteigend vergeben. Wenn man eine Seitentabelle oder eine Seite der Größe [m]x[/m] an Adresse [m]y[/m] legt, dann kann man die nächste Seite/Tabelle an Adresse [m]x+y[/m] anlegen. Natürlich muss man dabei beachten, dass die Tabellen oder Seiten richtig ausgerichtet sein müssen (war eben in der Aufgabe nicht gefordert) - dann kann es zu Lücken kommen (die man eventuell aber später wieder schließen könnte).

2 „Gefällt mir“

Ah, beginne solangsam zu verstehen

1 + 2 * 0x3ff = 0x7ff Einträge

Das würde bedeuten, wenn man (nach irgend einer Laune) mehrere Addressen hintereinander in derselben Tabelle ablegen würde, könnte man bekommen:
Stufe 1: 0xcf 03 01 01, 0xcf 03 0201, 0xcf 03 0301,…
Stufe 2: 0xcf 03 03 01, 0xcf 03 07 01, 0xcf 03 0B 01,…
Stufe 3: 0x98 73 50 05, 0x98 73 58 05, 0x9873 60 05,…


passt.

Da stimmt noch irgendwas nicht. So, wie das aufgebaut ist, haben wir den Fall, das folgende Tabellen 64 Einträge haben (müssen daher erste Stufe sein und für einen Prozessadressraum haben wir nur eine Tabelle der ersten Stufe):

  • [m]0xcf030000[/m]
  • [m]0xcf030100[/m]
  • [m]0xcf030200[/m]

Wir benötigen aber für die Tabellen der zweiten Stufe mehr Platz. Die Einträge der ersten Stufe müssten also eher

  • [m]0xcf030101[/m] (Tabelle nach der ersten Stufe (256 Byte), Größe: 512 Byte)
  • [m]0xcf030301[/m] (Tabelle (512 Byte) nach der Tabelle (512 Byte) nach der ersten Stufe (256 Byte))
  • [m]0xcf030501[/m] (Tabelle (512 Byte) nach der vorherigen Tabelle…)
    lauten.

Die Einträge der zweiten Stufe müssen dann auch dementsprechend angepasst werden, wobei wir beachten müssen, dass Tabellen der dritten Stufe 1024 Bytes groß sind ([m]0x400[/m]).

1 „Gefällt mir“