Exemple #1
0
 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;
 }
Exemple #2
0
 public static void GetMemoryRequirements(uint totalMem, PagingMemoryRequirements *req)
 {
     Diagnostics.Warning("Pager.GetMemoryRequirements - not implemented!");
 }
Exemple #3
0
        /// <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);
            }
        }