diff cos/kernel/mm.c @ 26:dcce92b1efbc

Added mm.c
author windel
date Tue, 27 Dec 2011 17:36:52 +0100
parents
children 47b7df514243
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cos/kernel/mm.c	Tue Dec 27 17:36:52 2011 +0100
@@ -0,0 +1,63 @@
+
+/* Memory manager */
+
+#include "kernel.h"
+
+// BITMAP functions:
+#define NFRAMES 1000
+// Bit mask to check what frames are in use and which are free:
+uint64_t frames[NFRAMES]; // NFRAMES*64*4kB frames.
+
+void set_frame(uint64_t frame)
+{
+   uint64_t idx = frame / 64;
+   uint64_t off = frame % 64;
+   frames[idx] |= (0x1 << off);
+}
+
+void clear_frame(uint64_t frame)
+{
+   uint64_t idx = frame / 64;
+   uint64_t off = frame % 64;
+   frames[idx] &= ~(0x1 << off);
+}
+
+uint64_t test_frame(uint64_t frame)
+{
+   uint64_t idx = frame / 64;
+   uint64_t off = frame % 64;
+   return (frames[idx] & (0x1 << off));
+}
+
+uint64_t first_frame()
+{
+   uint64_t i, j;
+   for (i = 0; i < NFRAMES / 64; i++)
+   {
+      if (frames[i] != 0xFFFFFFFFFFFFFFFF)
+      {
+         for (j = 0; j < 64; j++)
+         {
+            uint64_t dut = 0x1 << j;
+            if ((frames[i] & dut) != dut)
+            {
+               return i*64+j;
+            }
+         }
+      }
+   }
+   return 0xFFFFFFFFFFFFFFFF;
+}
+
+// Memory manager functions:
+void alloc_frame()
+{
+   uint64_t idx = first_frame();
+   if (idx == (uint64_t) -1)
+   {
+      panic("No more memory!");
+   }
+   set_frame(idx);
+}
+
+