Example #1
0
        public override void SetExecutionProtectionForAllInitialPages(LinkedMemoryRegion *currentTextSection)
        {
            // Must be enabled before setting the page bits, otherwise you get a PageFault exception because of using an reserved bit.
            EnableExecutionProtection();

            PageTableEntry *pte = (PageTableEntry *)PageTableEntries;

            for (uint index = 0; index < InitialPageTableEntries; index++)
            {
                var virtAddr      = index * 4096;
                var reg           = currentTextSection;
                var regionMatches = false;
                while (reg != null)
                {
                    if (reg->Region.Contains(virtAddr))
                    {
                        regionMatches = true;
                        break;
                    }
                    reg = reg->Next;
                }
                if (regionMatches)
                {
                    continue;
                }
                var e = &pte[index];
                e->DisableExecution = true;
            }
        }
Example #2
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));
            }
        }
Example #3
0
        public override void SetKernelWriteProtectionForAllInitialPages()
        {
            PageTableEntry *pte = PageTableEntries;

            for (int index = 0; index < InitialPageTableEntries; index++)
            {
                var e = &pte[index];
                e->Writable = false;
            }
        }
Example #4
0
 private static PageDirectoryEntry *RegisterPage(PageTableEntry *page)
 {
     if (currentDictionaryEntryCount == 0 || currentTableEntryCount == 1024)
     {
         currentDictionaryEntryCount++;
         var dicEntry = GetPageDirectoryEntry(currentDictionaryEntryCount - 1);
         dicEntry->PageTableEntry = page;
         dicEntry->Present        = true;
         dicEntry->Writable       = true;
         dicEntry->User           = true;
         currentTableEntryCount   = 0;
     }
     return(GetPageDirectoryEntry(currentDictionaryEntryCount - 1));
 }
Example #5
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");
        }
Example #6
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();
        }
Example #7
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));
            }
        }
Example #8
0
 public override void KernelSetup(Addr entriesAddr)
 {
     PageDirectoryEntries = (PageDirectoryEntry *)entriesAddr;
     PageTableEntries     = (PageTableEntry *)(entriesAddr + InitalPageDirectorySize);
     //PrintAddress();
 }
Example #9
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();
        }
Example #10
0
 private void SetAddress(Addr entriesAddr)
 {
     AddrPageDirectoryPT = entriesAddr;
     AddrPageDirectory   = entriesAddr + InitalPageDirectoryPTSize;
     PageTableEntries    = (PageTableEntry *)(entriesAddr + InitalPageDirectoryPTSize + InitalPageDirectorySize);
 }