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)); } }
/// <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"); }
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(); }
public static bool Test() { pageDirectoryEntries = (PageDirectoryEntry *)pageDirectoryAddress; return(GetItem(1)); }
/// <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)); } }
public static bool Test() { pageDirectoryEntries = (PageDirectoryEntry*)pageDirectoryAddress; return GetItem(1); }
public override void KernelSetup(Addr entriesAddr) { PageDirectoryEntries = (PageDirectoryEntry *)entriesAddr; PageTableEntries = (PageTableEntry *)(entriesAddr + InitalPageDirectorySize); //PrintAddress(); }
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(); }