Speicherverwaltung — Änderungen 3071 → 3468

Zeile 45: Zeile 45:
 
=== Fazit ===
 
=== Fazit ===
 
Zusammenfassend lässt sich festhalten, dass eine Kombination aus den oben erklärten Datenstrukturen das Beste sein wird. Die Bitmap hat den Vorteil, dass man physisch kontinuierlichen Speicher allozieren kann. Dies benötigt man vor allem für [[DMA]]. Das heißt es macht Sinn bei der [[x86]]- bzw. [[x86-64]]-Architektur die unteren 1/16MB mit einer Bitmap zu verwalten. Der Stack hingegen hat einen unschlagbaren Geschwindigkeits- und Speichervorteil und kann für den Rest des Speichers verwendet werden.
 
Zusammenfassend lässt sich festhalten, dass eine Kombination aus den oben erklärten Datenstrukturen das Beste sein wird. Die Bitmap hat den Vorteil, dass man physisch kontinuierlichen Speicher allozieren kann. Dies benötigt man vor allem für [[DMA]]. Das heißt es macht Sinn bei der [[x86]]- bzw. [[x86-64]]-Architektur die unteren 1/16MB mit einer Bitmap zu verwalten. Der Stack hingegen hat einen unschlagbaren Geschwindigkeits- und Speichervorteil und kann für den Rest des Speichers verwendet werden.
 +
 +
=== Initialisierung ===
 +
Unabhängig von der Wahl der Speicherstruktur muss diese relativ früh im Kernel initialisiert werden, d.h. alle beim Start verfügbaren Bereiche müssen als frei und alle anderen als besetzt markiert werden. Außerdem möchte man unter Umständen noch einen freien Platz für die Bitmap/den Stack suchen, bevor man die freien und reservierten Bereiche überhaupt eintragen kann. (Wenn man nicht so penibel ist, tut es im Allgemeinen aber auch ein fest vordefinierter Platz im Speicher.)
 +
 +
Die einfachste, intuitiv oft gewählte und falsche Methode zur Initialisierung ist, die Speichergröße (vom [[BIOS]] oder der [[Multiboot]]-Struktur) herzunehmen und genau soviel Speicher als frei zu markieren. Stattdessen sollte man die Informationen aus der Memory Map des BIOS bevorzugen, die unter anderem alle freien Speicherbereiche mit Startadresse und Länge aufzählt. Die Memory Map wird auch von [[GRUB]] in der Multiboot-Struktur übergeben, siehe dazu die Felder [[Multiboot#mbs_mmap_length | mbs_mmap_*]].
 +
 +
Anschließend sollte man nicht vergessen, weitere Bereiche als reserviert zu markieren, die z.B. bereits vom Kernel selbst genutzt werden und nicht überschrieben werden sollten. Typischerweise sind das:
 +
* Der Kernel
 +
* Die Multiboot-Struktur
 +
* Von GRUB geladene Kernelmodule und ihre Kommandozeile
 +
* Die Speicherverwaltungsstrukturen selbst, also z.B. der Platz, den die Bitmap einnimmt
  
 
== virtuelle Speicherverwaltung ==
 
== virtuelle Speicherverwaltung ==