Beispiel #1
0
        public const uint PageTablesMaxSize  = PageTablesMaxCount * PageTableEntry.EntrySize; //Size of 1024 PageTables in 1024 PageDirectories

        /// <summary>
        /// Sets up the PageTable
        /// </summary>
        public static void Setup()
        {
            pageDirectoryEntries = (PageDirectoryEntry *)pageDirectoryAddress;
            pageTableEntries     = (PageTableEntry *)pageTableAddress;

            ClearPageDirectory();
            ClearPageTable();

            // Map the first 128MB of memory (32768 4K pages) (why 128MB?)
            for (uint index = 0; index < 1024 * 32; index++)
            {
                AllocatePage();
            }

            MapVirtualAddressToPhysical(0xFFC00000, 0x0);
            MapVirtualAddressToPhysical(0x0, 0x0, false);

            //Panic.DumpMemory(pageDirectoryAddress);

            // Set CR3 register on processor - sets page directory
            Native.SetCR3(pageDirectoryAddress);

            // Set CR0 register on processor - turns on virtual memory
            Native.SetCR0(Native.GetCR0() | BitMask.Bit31);

            unsafe
            {
                //Panic.Error(Mosa.ClassLib.FlechterChecksum.Fletcher16((byte*)pageDirectoryAddress, PageDirectorySize));
            }
        }
Beispiel #2
0
        /// <summary>
        /// Sets up the PageTable
        /// </summary>
        public static void Setup(Addr addrPageDirectory, Addr addrPageTable)
        {
            KernelMessage.WriteLine("Setup PageTable");

            AddrPageDirectory = addrPageDirectory;
            AddrPageTable     = addrPageTable;

            // Setup Page Directory
            PageDirectoryEntry *pde = (PageDirectoryEntry *)AddrPageDirectory;

            for (int index = 0; index < 1024; index++)
            {
                pde[index]                = new PageDirectoryEntry();
                pde[index].Present        = true;
                pde[index].Writable       = true;
                pde[index].User           = true;
                pde[index].PageTableEntry = (PageTableEntry *)(uint)(AddrPageTable + (index * 4096));
            }

            // Map the first 128MB of memory (32786 4K pages) (why 128MB?)
            for (int index = 0; index < 1024 * 32; index++)
            {
                PageTableEntry *pte = (PageTableEntry *)AddrPageTable;
                pte[index]                 = new PageTableEntry();
                pte[index].Present         = true;
                pte[index].Writable        = true;
                pte[index].User            = true;
                pte[index].PhysicalAddress = (uint)(index * 4096);
            }

            // Unmap the first page for null pointer exceptions
            MapVirtualAddressToPhysical(0x0, 0x0, false);

            // Set CR3 register on processor - sets page directory
            KernelMessage.WriteLine("Set CR3 to {0:X8}", PageTable.AddrPageDirectory);
            Native.SetCR3(AddrPageDirectory);

            KernelMessage.Write("Enable Paging... ");

            // Set CR0.WP
            Native.SetCR0(Native.GetCR0() | 0x10000);

            // Set CR0 register on processor - turns on virtual memory
            Native.SetCR0(Native.GetCR0() | 0x80000000);

            KernelMessage.WriteLine("Done");
        }
Beispiel #3
0
        private void SetupBasicStructure(Addr entriesAddr)
        {
            KernelMessage.WriteLine("Setup PageTable");
            MemoryOperation.Clear4(entriesAddr, InitalMemoryAllocationSize);

            PageDirectoryEntries = (PageDirectoryEntry *)entriesAddr;
            PageTableEntries     = (PageTableEntry *)(entriesAddr + InitalPageDirectorySize);

            // Setup Page Directory
            PageDirectoryEntry *pde = PageDirectoryEntries;
            PageTableEntry *    pte = PageTableEntries;

            KernelMessage.WriteLine("Total Page Entries: {0}", InitialPageTableEntries);
            KernelMessage.WriteLine("Total Page Dictionary Entries: {0}", InitialDirectoryEntries);

            //for (int pidx = 0; pidx < InitialPageTableEntries; pidx++)
            //{
            //    pte[pidx] = new PageTableEntry
            //    {
            //        Present = true,
            //        Writable = true,
            //        User = true,
            //        PhysicalAddress = (uint)(pidx * 4096),
            //    };
            //}

            for (int didx = 0; didx < InitialDirectoryEntries; didx++)
            {
                pde[didx] = new PageDirectoryEntry
                {
                    Present        = true,
                    Writable       = true,
                    User           = true,
                    PageTableEntry = &pte[didx * PagesPerDictionaryEntry],
                };
            }

            // Unmap the first page for null pointer exceptions
            //MapVirtualAddressToPhysical(0x0, 0x0, false);

            PrintAddress();
        }
Beispiel #4
0
 public static bool Test()
 {
     pageDirectoryEntries = (PageDirectoryEntry *)pageDirectoryAddress;
     return(GetItem(1));
 }
Beispiel #5
0
        /// <summary>
        /// Sets up the PageTable
        /// </summary>
        public static void Setup()
        {
            pageDirectoryEntries = (PageDirectoryEntry*)pageDirectoryAddress;
            pageTableEntries = (PageTableEntry*)pageTableAddress;

            ClearPageDirectory();
            ClearPageTable();

            // Map the first 128MB of memory (32768 4K pages) (why 128MB?)
            for (uint index = 0; index < 1024 * 32; index++)
                AllocatePage();

            MapVirtualAddressToPhysical(0xFFC00000, 0x0);
            MapVirtualAddressToPhysical(0x0, 0x0, false);

            //Panic.DumpMemory(pageDirectoryAddress);

            // Set CR3 register on processor - sets page directory
            Native.SetCR3(pageDirectoryAddress);

            // Set CR0 register on processor - turns on virtual memory
            Native.SetCR0(Native.GetCR0() | BitMask.Bit31);

            unsafe
            {
                //Panic.Error(Mosa.ClassLib.FlechterChecksum.Fletcher16((byte*)pageDirectoryAddress, PageDirectorySize));
            }
        }
Beispiel #6
0
 public static bool Test()
 {
     pageDirectoryEntries = (PageDirectoryEntry*)pageDirectoryAddress;
     return GetItem(1);
 }
Beispiel #7
0
 public override void KernelSetup(Addr entriesAddr)
 {
     PageDirectoryEntries = (PageDirectoryEntry *)entriesAddr;
     PageTableEntries     = (PageTableEntry *)(entriesAddr + InitalPageDirectorySize);
     //PrintAddress();
 }
Beispiel #8
0
        private void SetupBasicStructure(Addr entriesAddr)
        {
            KernelMessage.WriteLine("Setup PageTable");
            SetAddress(entriesAddr);

            MemoryOperation.Clear4(AddrPageDirectoryPT, InitalMemoryAllocationSize);

            // uint mask = 0x00004000;
            // uint v1 = 0x00000007;
            // uint r1 = v1.SetBits(12, 52, mask, 12);

            // ulong v2 = v1;
            // ulong r2 = v2.SetBits(12, 52, mask, 12);
            // uint r2Int = (uint)r2;

            // KernelMessage.WriteLine("r1: {0:X8}", r1);
            // KernelMessage.WriteLine("r2: {0:X8}", r2Int);

            // Setup Page Directory
            PageDirectoryPointerTableEntry *pdpt = (PageDirectoryPointerTableEntry *)AddrPageDirectoryPT;
            PageDirectoryEntry *            pde  = (PageDirectoryEntry *)AddrPageDirectory;
            PageTableEntry *pte = PageTableEntries;

            KernelMessage.WriteLine("Total PDPT: {0}", InitialDirectoryPTEntries);
            KernelMessage.WriteLine("Total Page Dictionary Entries: {0}", InitialDirectoryEntries);
            KernelMessage.WriteLine("Total Page Table Entries: {0}", InitialPageTableEntries);

            //for (int pidx = 0; pidx < InitialPageTableEntries; pidx++)
            //{
            //    pte[pidx] = new PageTableEntry
            //    {
            //        Present = true,
            //        Writable = true,
            //        User = true,
            //        PhysicalAddress = (uint)(pidx * 4096),
            //    };
            //}

            for (int didx = 0; didx < InitialDirectoryEntries; didx++)
            {
                pde[didx] = new PageDirectoryEntry
                {
                    Present        = true,
                    Writable       = true,
                    User           = true,
                    PageTableEntry = &pte[didx * PagesPerDictionaryEntry],
                };
            }

            for (int ptidx = 0; ptidx < InitialDirectoryPTEntries; ptidx++)
            {
                pdpt[ptidx] = new PageDirectoryPointerTableEntry
                {
                    Present            = true,
                    PageDirectoryEntry = &pde[ptidx * PagesPerDictionaryEntry],
                };
            }

            // Unmap the first page for null pointer exceptions
            //MapVirtualAddressToPhysical(0x0, 0x0, false);

            PrintAddress();
        }