Hi Guys,

                I was fiddling with the PageAllocator and discovered that it 
was not efficent.  So I started making small modifications.  First patch is 
Pager.cs where 1MB is added as reserved.  2nd in PageAllocator.  The way I see 
it its not needed to Push all the pages to the Stack initally so I decided to 
make it on demand.  I also plan on making it check only for reserved pages it 
has not passed (Pages are allocated in sequence).  NOTE:  I have not looked at 
RangeAlloc as its not used atm J.  I just wanted your comments on this before I 
invest some time on it.

Regards
   Ásgeir Halldórsson



Index: Kernel/Core/ADC/X86/Pager.cs
===================================================================
--- Kernel/Core/ADC/X86/Pager.cs      (revision 457)
+++ Kernel/Core/ADC/X86/Pager.cs      (working copy)
@@ -246,12 +246,9 @@
                       // Reserve memory below 0x100000 (1MB) for the 
BIOS/video memory
                       uint ceil = 0x100000;
                       byte *page = null;
-
-                      while ((uint)page < ceil) {
-                              PageAllocator.ReservePage (page);
-                              page += 4096;
-                      }

+            PageAllocator.ReservePageRange(page, (ceil / 
ADC.Pager.AtomicPageSize), "Reserve memory below 0x100000 (1MB) for the 
BIOS/video memory");
+
                       *error = PageAllocator.Errors.Success;
                       return *error;
               }




Index: Kernel/Core/PageAllocator.cs

===================================================================

--- Kernel/Core/PageAllocator.cs      (revision 457)

+++ Kernel/Core/PageAllocator.cs      (working copy)

@@ -9,6 +9,7 @@



 using SharpOS.AOT;

 using SharpOS.ADC;

+using System.Runtime.InteropServices;



 namespace SharpOS.Memory {



@@ -25,12 +26,14 @@

               static byte *kernelStartPage;  // physical pointer to the first 
page occupied by the kernel

               static uint kernelSize;               // kernel image size 
(pages)

               static uint totalPages;               // amount of pages with RAM

-

-              static uint *fpStack;          // stack containing free page 
addresses

+

+        static uint currentPage;

+        static uint *fpStack;        // stack containing free page addresses

               static uint fpStackSize;       // size of the free page stack 
(KB)

               static uint fpStackPointer;

-

-              static uint *rpStack;          // stack containing reserved page 
addresses

+

+        static bool reservedPagesLeft;

+        static ReservedPages *rpStack;              // stack containing 
reserved page addresses

               static uint rpStackSize;       // size of the reserved page 
stack (KB)

               static uint rpStackPointer;



@@ -39,7 +42,13 @@



               #endregion

               #region Nested types

-

+        [StructLayout(LayoutKind.Sequential)]

+        private struct ReservedPages

+        {

+            public uint Address;

+            public uint Size;

+        }

+

               public enum Errors: uint {

                       Success = 0,

                       Unknown,

@@ -95,9 +104,10 @@

                       start += fpStackSize * Pager.AtomicPageSize;



                       // Allocate the reserved page stack

-                      rpStack = (uint*)start;

+            rpStack = (ReservedPages*)start;

                       rpStackPointer = 0;

                       rpStackSize = 1;

+            reservedPagesLeft = false;



                       // Allocate paging information

                       pagingMemory->Start = (byte*)PtrToPage(start + 
(rpStackSize * 1024) + (Pager.AtomicPageSize - 1));

@@ -130,13 +140,7 @@

                               Kernel.Warning("Paging not set in commandline!");



                       // NOTE: 0x0000 page is reserved

-                      for (int i = (int)(totalPages - 1); i >= 1; --i)

-                      {

-                              // we should be doing this but it's so slow!

-                              // it needs to be rewritten to be fast enough to 
do..

-                              //if (!IsPageReserved(page))

-                                     PushFreePage((byte*)(i * 
Pager.AtomicPageSize));

-                      }

+            currentPage = 1;



                       if (paging)

                       {

@@ -196,17 +200,18 @@

               /// </summary>

               public static bool IsPageReserved (void *page)

               {

-                      uint sp = 0;

-                      uint *ptr = rpStack;

-

-                      while (sp < rpStackPointer) {

-                              if (*ptr == (uint)page)

-                                     return true;

-                              ++sp;

-                             ++ptr;

-                      }

-

-                      return false;

+            uint sp = 0;

+            ReservedPages* ptr = rpStack;

+

+            while (sp < rpStackPointer)

+            {

+                if (ptr->Address >= (uint)page && (ptr->Address + ptr->Size) 
<= (uint)page)

+                    return true;

+                ++sp;

+                ++ptr;

+            }

+

+            return false;

               }



               #endregion

@@ -219,16 +224,11 @@

               {

                       void *page = null;



-                      if (fpStackPointer == 0)

-                              return null;

-

                       do {

                               page = PopFreePage ();

-                              if (!IsPageReserved(page))     // slow!

-                                     return page;

-                      } while (page != null);

+                      } while (page == null);



-                      return null;

+                      return page;

               }



               /// <summary>

@@ -432,7 +432,11 @@



               #endregion

               #region ReservePage () family

-

+        private static ReservedPages* GetReservedPage()

+        {

+            return &rpStack[rpStackPointer++];

+        }

+

               /// <summary>

               /// Reserves a memory page so that it cannot be allocated using

               /// <see cref="M:Alloc()" /> or <see cref="M:RangeAlloc(uint 
count)" />.

@@ -442,6 +446,7 @@

               /// </param>

               public static bool ReservePage(void *page)

               {

+            reservedPagesLeft = true;

                       if (page == null)

                               return false;



@@ -451,10 +456,12 @@



                       //if (!IsPageFree(page, &fsp))

                       //      return false;

-

-                      PushReservedPage(page);

-

-                      return true;

+

+            ReservedPages* pages = GetReservedPage();

+            pages->Address = (uint)page;

+            pages->Size = 1;

+

+            return true;

               }



               /// <summary>

@@ -469,13 +476,13 @@

               /// </param>

               public static bool ReservePageRange(void *firstPage, uint pages, 
string name)

               {

-                      byte*   page = (byte*)firstPage;

-                      for (int i = 0; i < pages; i++)

-                      {

-                              PushReservedPage(page);

-                              page += Pager.AtomicPageSize;

-                      }

-                      return false;

+            reservedPagesLeft = true;

+

+            ReservedPages* reservePages = GetReservedPage();

+            reservePages->Address = (uint)firstPage;

+            reservePages->Size = pages;

+

+            return true;

               }



               #endregion

@@ -551,15 +558,26 @@



               private static void *PopFreePage()

               {

-                      if (fpStackPointer == 0)

-                              return null;

-                      return (void*)fpStack[--fpStackPointer];

+            if (fpStackPointer == 0 && currentPage < (totalPages - 1))

+            {

+                while (currentPage < (totalPages - 1))

+                {

+                    uint* page = (uint*)(currentPage * Pager.AtomicPageSize);

+                    currentPage++;

+

+                    if (IsPageReserved(page))

+                    {

+                        continue;

+                    }

+

+                    return (void*)page;

+                }

+            }

+            else if (fpStackPointer == 0)

+                return null;

+

+            return (void*)fpStack[--fpStackPointer];

               }

-

-              private static void PushReservedPage(void *page)

-              {

-                      rpStack[rpStackPointer++] = (uint)page;

-              }



               #endregion

               #region Debug

@@ -580,7 +598,7 @@

                       ADC.TextMode.WriteLine("Free");

                       Dump(fpStack, fpStackPointer, count);

                       ADC.TextMode.WriteLine("Reserved");

-                      Dump(rpStack, rpStackPointer, count);

+                      //Dump(rpStack, rpStackPointer, count);

               }



               #endregion

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
SharpOS-Developers mailing list
SharpOS-Developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sharpos-developers

Reply via email to