public static void GetMemoryRequirements(uint totalMem, PagingMemoryRequirements *req) { req->AtomicPages = ComputeControlReq(totalMem); // this can't be right?? //req->Start = null; req->Error = PageAllocator.Errors.Success; }
public static void GetMemoryRequirements(uint totalMem, PagingMemoryRequirements *req) { Diagnostics.Warning("Pager.GetMemoryRequirements - not implemented!"); }
/// <summary> /// Initializes page management and paging. Using <see cref="Alloc" /> /// and related management functions before calling this function results /// in a kernel panic. After this function is called, the /// <see cref="ReservePage"/> and <see cref="ReservePageRange" /> /// functions can be used to reserve memory that should not be allocated. /// You should ensure that no memory allocations have happened between /// calling this function and reserving memory. /// </summary> public static void Setup(byte *kernelOffset, uint _kernelSize, uint totalKbMem) { PagingMemoryRequirements *pagingMemory = stackalloc PagingMemoryRequirements[1]; // The total memory in bytes totalMem = totalKbMem * 1024; // Total pages totalPages = totalMem / Pager.AtomicPageSize; // First page of the kernel kernelStartPage = (byte *)PtrToPage(kernelOffset); // Kernel size in pages kernelSize = (_kernelSize / Pager.AtomicPageSize) + 1; // Allocate the free page stack immediately after end of the kernel fpStack = (uint *)(kernelStartPage + (kernelSize * Pager.AtomicPageSize)); // Initalize the stack pointer fpStackPointer = 0; // Free page stack size in pages fpStackSize = (totalPages * (uint)sizeof(uint *) / Pager.AtomicPageSize) + 1; // Allocate the reserved page stack immediately after free page stack rpStack = (ReservedPages *)((uint)fpStack + (fpStackSize * Pager.AtomicPageSize)); // Initalize the reserve stack pointer rpStackPointer = 0; // Reserve stack size in pages rpStackSize = 1; // fixed - should be enough // Allocate paging information pagingData = (byte *)(rpStack + (rpStackSize * Pager.AtomicPageSize)); pagingMemory->Start = (void *)pagingData; // Reserve 4 mega bytes of memory for Virtual memory manager // FIXME: pagingDataSize = (4 * 1024 * 1024) / 4096; // Reserve the memory ranges we're using. ReservePageRange(kernelStartPage, kernelSize, "kernel"); ReservePageRange(fpStack, fpStackSize, "fpstack"); ReservePageRange(rpStack, rpStackSize, "rpstack"); ReservePageRange(pagingData, pagingDataSize, "paging"); // Reserve memory below 0x100000 (1MB) for the BIOS/video memory ReservePageRange((void *)0, (0x100000 / ADC.Pager.AtomicPageSize), "Reserve memory below 0x100000 (1MB) for the BIOS/video memory"); // FIXME: the value we get back from Pager.Setup is not the same value that // we 'return' from inside the method itself!!!! Errors error = Errors.Unknown; Pager.Setup(totalKbMem, pagingData, pagingDataSize, &error); if (error != Errors.Success) { PrintError(error); return; } // NOTE: 0x0000 page is reserved currentPage = 1; error = Errors.Unknown; Pager.Enable(&error); if (error != Errors.Success) { PrintError(error); } }