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