[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] kernel2: Initialisierung der physischen Speicherverwaltung fixen



! kernel2: Solange die Speicherbitmap nicht festgelegt ist, ist es nicht
  besonders sinnvoll, sie als reserviert zurueckzugeben
! kernel2: Die Speicherbitmap muss page-aligned sein
! kernel2: Die Speicherbitmap darf direkt an einen belegten Bereich
  anschliessen. Da end die naechste freie Adresse bezeichnet, ist
  Gleichheit zwischen dem Ende des belegten Bereichs und Anfang der
  Speicherbitmap auch erlaubt.
---
 src/kernel2/src/mm/phys.c |   34 ++++++++++++++++++++++++++++------
 1 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/kernel2/src/mm/phys.c b/src/kernel2/src/mm/phys.c
index 9a68648..2f91ec8 100644
--- a/src/kernel2/src/mm/phys.c
+++ b/src/kernel2/src/mm/phys.c
@@ -348,6 +348,15 @@ struct mem_block {
 };
 
 /**
+ * Wird benutzt, um nacheinander alle vom BIOS aus freien Speicherbereiche
+ * aufzuzaehlen. Dies bedeutet nicht, dass die zurueckgegebenen
+ * Speicherbereiche frei benutzt werden koennen. Um festzustellen, ob nicht
+ * tyndur Bereiche benoetigt (z.B. fuer Kernel oder Multiboot-Strukturen), muss
+ * zusaetzlich get_reserved_block() benutzt werden.
+ *
+ * @param multiboot_info Pointer auf die Multiboot-Info
+ * @param i Index des freien Speicherbereichs
+ *
  * @return Beschreibung des freien Speicherblocks. Wenn i größer als die
  * Anzahl der freien Blocks ist, wird ein Block mit start > end
  * zurückgegeben.
@@ -384,17 +393,29 @@ static struct mem_block get_free_block
 }
 
 /**
+ * Wird benutzt, um nacheinander alle belegten Speicherbereiche aufzuzaehlen.
+ * Dies sind vor allem Kernel, Module und Multiboot-Strukturen. Vom BIOS als
+ * reserviert gekennzeichnete Bereiche sind hierbei nicht enthalten. Um die
+ * vom BIOS aus freien Bereiche zu erhalten, muss get_free_block() benutzt
+ * werdem.
+ *
+ * @param multiboot_info Pointer auf die Multiboot-Info
+ * @param i Index des belegten Speicherbereichs
+ * @param bitmap Wenn TRUE, wird auch der Platz der Speicherbitmap als
+ * reserviert gekennzeichnet. Wenn die Speicherbitmap noch nicht platziert
+ * wurde, muss dieser Parameter FALSE sein.
+ *
  * @return Beschreibung des reservierten Blocks. Wenn i größer als die
  * Anzahl der reservierten Blocks ist, wird ein Block mit start > end
  * zurückgegeben.
  */
 static struct mem_block get_reserved_block
-    (struct multiboot_info* multiboot_info, size_t i)
+    (struct multiboot_info* multiboot_info, size_t i, bool bitmap)
 {
     struct mem_block result;
 
     // Die Bitmap ist bereits zugewiesen, wenn diese Funktion aufgerufen wird
-    if (i-- == 0) {
+    if (bitmap && (i-- == 0)) {
         result.start    = pmm_bitmap;
         result.end      = pmm_bitmap +
             ((pmm_bitmap_length / 8) * PMM_BITS_PER_ELEMENT);
@@ -480,12 +501,13 @@ static paddr_t find_bitmap_mem
             j = 0;
             do
             {
-                reserved = get_reserved_block(multiboot_info, j++);
+                reserved = get_reserved_block(multiboot_info, j++, FALSE);
                 if (!((reserved.start > bitmap + size)
-                    || (reserved.end < bitmap)))
+                    || (reserved.end <= bitmap)))
                 {
                     j = 0;
-                    bitmap = reserved.end;
+                    bitmap = (paddr_t)
+                        PAGE_ALIGN_ROUND_UP((uintptr_t) reserved.end);
                 }
             }
             while ((bitmap <= free.end) && (reserved.start < reserved.end));
@@ -577,7 +599,7 @@ void pmm_init(struct multiboot_info* multiboot_info)
     i = 0;
     do
     {
-        struct mem_block block = get_reserved_block(multiboot_info, i++);
+        struct mem_block block = get_reserved_block(multiboot_info, i++, TRUE);
 
         // Wenn der Start nach dem Ende liegt, ist der Block ungültig
         // und wir sind fertig
-- 
1.6.0.2