public override void Unmap(uint vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { //if (Unmap_Print) //{ // BasicConsole.WriteLine("Getting physical addr..."); //} uint pAddr = GetPhysicalAddress(vAddr); //if (Unmap_Print) //{ // BasicConsole.WriteLine("Calculating virt addr parts..."); //} uint virtPDIdx = vAddr >> 22; uint virtPTIdx = (vAddr >> 12) & 0x03FF; //if (Unmap_Print) //{ // BasicConsole.WriteLine("Calculating phys addr parts..."); //} uint physPDIdx = pAddr >> 22; uint physPTIdx = (pAddr >> 12) & 0x03FF; //if (Unmap_Print) //{ // BasicConsole.WriteLine("Checking flags & stuff..."); //} if ((UpdateUsedPages & UpdateUsedPagesFlags.Physical) != 0) { UsedPhysPages.Clear((int)((physPDIdx * 1024) + physPTIdx)); } if ((UpdateUsedPages & UpdateUsedPagesFlags.Virtual) != 0) { UsedVirtPages.Clear((int)((virtPDIdx * 1024) + virtPTIdx)); } //if (Unmap_Print) //{ // BasicConsole.WriteLine("Getting page table..."); //} uint *virtPTPtr = GetFixedPage(virtPDIdx); //if (Unmap_Print) //{ // BasicConsole.WriteLine("Setting page entry..."); //} SetPageEntry(virtPTPtr, virtPTIdx, 0, PTEFlags.None); //if (Unmap_Print) //{ // BasicConsole.WriteLine("Invalidating page table entry..."); //} InvalidatePTE(vAddr); }
public override void Map(uint pAddr, uint vAddr, PageFlags flags, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { PTEFlags pteFlags = PTEFlags.None; if ((flags & PageFlags.Present) != 0) { pteFlags |= PTEFlags.Present; } if ((flags & PageFlags.KernelOnly) == 0) { pteFlags |= PTEFlags.UserAllowed; } if ((flags & PageFlags.Writeable) != 0) { pteFlags |= PTEFlags.Writeable; } Map(pAddr, vAddr, pteFlags, UpdateUsedPages); }
private void Map(uint pAddr, uint vAddr, PTEFlags flags, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { #if PAGING_TRACE BasicConsole.WriteLine("Mapping addresses..."); #endif //Calculate page directory and page table indices uint virtPDIdx = vAddr >> 22; uint virtPTIdx = (vAddr >> 12) & 0x03FF; uint physPDIdx = pAddr >> 22; uint physPTIdx = (pAddr >> 12) & 0x03FF; #if PAGING_TRACE BasicConsole.WriteLine(((FOS_System.String) "pAddr=") + pAddr); BasicConsole.WriteLine(((FOS_System.String) "vAddr=") + vAddr); BasicConsole.WriteLine(((FOS_System.String) "physPDIdx=") + physPDIdx); BasicConsole.WriteLine(((FOS_System.String) "physPTIdx=") + physPTIdx); BasicConsole.WriteLine(((FOS_System.String) "virtPDIdx=") + virtPDIdx); BasicConsole.WriteLine(((FOS_System.String) "virtPTIdx=") + virtPTIdx); #endif if ((UpdateUsedPages & UpdateUsedPagesFlags.Physical) != 0) { UsedPhysPages.Set((int)((physPDIdx * 1024) + physPTIdx)); } if ((UpdateUsedPages & UpdateUsedPagesFlags.Virtual) != 0) { UsedVirtPages.Set((int)((virtPDIdx * 1024) + virtPTIdx)); } //Get a pointer to the pre-allocated page table uint *virtPTPtr = GetFixedPage(virtPDIdx); #if PAGING_TRACE BasicConsole.WriteLine(((FOS_System.String) "ptPtr=") + (uint)virtPTPtr); #endif //Set the page table entry SetPageEntry(virtPTPtr, virtPTIdx, pAddr, flags); //Set directory table entry SetDirectoryEntry(virtPDIdx, (uint *)GetPhysicalAddress((uint)virtPTPtr)); //Invalidate the page table entry so that mapping isn't CPU cached. InvalidatePTE(vAddr); }
public static void Unmap(void* vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { Unmap((uint)vAddr, UpdateUsedPages); }
/// <summary> /// Maps the specified amount of memory. /// </summary> /// <param name="pAddr">The physical address to start mapping at (must be 4KiB aligned).</param> /// <param name="vAddr">The virtual address to start mapping at (must be 4KiB aligned).</param> /// <param name="size">The amount of memory (in bytes) to map (must be a multiple of 4KiB)</param> public static void Map(uint pAddr, uint vAddr, uint size, VirtMemImpl.PageFlags flags, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { flags |= VirtMemImpl.PageFlags.Present | VirtMemImpl.PageFlags.Writeable; while (size > 0) { impl.Map(pAddr, vAddr, flags, UpdateUsedPages); size -= 4096; pAddr += 4096; vAddr += 4096; } }
public virtual void Map(uint pAddr, uint vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { Map(pAddr, vAddr, PageFlags.Present | PageFlags.KernelOnly | PageFlags.Writeable, UpdateUsedPages); }
private void Map(uint pAddr, uint vAddr, PTEFlags flags, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { #if PAGING_TRACE BasicConsole.WriteLine("Mapping addresses..."); #endif //Calculate page directory and page table indices uint virtPDIdx = vAddr >> 22; uint virtPTIdx = (vAddr >> 12) & 0x03FF; uint physPDIdx = pAddr >> 22; uint physPTIdx = (pAddr >> 12) & 0x03FF; #if PAGING_TRACE BasicConsole.WriteLine(((FOS_System.String)"pAddr=") + pAddr); BasicConsole.WriteLine(((FOS_System.String)"vAddr=") + vAddr); BasicConsole.WriteLine(((FOS_System.String)"physPDIdx=") + physPDIdx); BasicConsole.WriteLine(((FOS_System.String)"physPTIdx=") + physPTIdx); BasicConsole.WriteLine(((FOS_System.String)"virtPDIdx=") + virtPDIdx); BasicConsole.WriteLine(((FOS_System.String)"virtPTIdx=") + virtPTIdx); #endif if ((UpdateUsedPages & UpdateUsedPagesFlags.Physical) != 0) { UsedPhysPages.Set((int)((physPDIdx * 1024) + physPTIdx)); } if((UpdateUsedPages & UpdateUsedPagesFlags.Virtual) != 0) { UsedVirtPages.Set((int)((virtPDIdx * 1024) + virtPTIdx)); } //Get a pointer to the pre-allocated page table uint* virtPTPtr = GetFixedPage(virtPDIdx); #if PAGING_TRACE BasicConsole.WriteLine(((FOS_System.String)"ptPtr=") + (uint)virtPTPtr); #endif //Set the page table entry SetPageEntry(virtPTPtr, virtPTIdx, pAddr, flags); //Set directory table entry SetDirectoryEntry(virtPDIdx, (uint*)GetPhysicalAddress((uint)virtPTPtr)); //Invalidate the page table entry so that mapping isn't CPU cached. InvalidatePTE(vAddr); }
public override void Unmap(uint vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { uint pAddr = GetPhysicalAddress(vAddr); uint virtPDIdx = vAddr >> 22; uint virtPTIdx = (vAddr >> 12) & 0x03FF; uint physPDIdx = pAddr >> 22; uint physPTIdx = (pAddr >> 12) & 0x03FF; if ((UpdateUsedPages & UpdateUsedPagesFlags.Physical) != 0) { UsedPhysPages.Clear((int)((physPDIdx * 1024) + physPTIdx)); } if ((UpdateUsedPages & UpdateUsedPagesFlags.Virtual) != 0) { UsedVirtPages.Clear((int)((virtPDIdx * 1024) + virtPTIdx)); } uint* virtPTPtr = GetFixedPage(virtPDIdx); SetPageEntry(virtPTPtr, virtPTIdx, 0, PTEFlags.None); InvalidatePTE(vAddr); }
/// <summary> /// Unmaps the specified page of virtual memory. /// </summary> /// <remarks> /// <para> /// Unmaps means it sets the address to 0 and marks the page as not present. /// </para> /// <para> /// It is common to call this with just UpdateUsedPages set to Virtual, since then the virtual page becomes available for use /// but the physical page remains reserved (though unmapped). /// </para> /// </remarks> /// <param name="vAddr">The virtual address of the page to unmap.</param> /// <param name="UpdateUsedPages">Which, if any, of the physical and virtual used pages lists to update.</param> public abstract void Unmap(uint vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both);
/// <summary> /// Unmaps the specified page of virtual memory. /// </summary> /// <remarks> /// <para> /// Unmaps means it sets the address to 0 and marks the page as not present. /// </para> /// <para> /// It is common to call this with just UpdateUsedPages set to Virtual, since then the virtual page becomes available for use /// but the physical page remains reserved (though unmapped). /// </para> /// </remarks> /// <param name="vAddr">The virtual address of the page to unmap.</param> /// <param name="UpdateUsedPages">Which, if any, of the physical and virtual used pages lists to update.</param> public static void Unmap(uint vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { impl.Unmap(vAddr, UpdateUsedPages); }
/// <summary> /// Unmaps the specified page of virtual memory. /// </summary> /// <remarks> /// <para> /// Unmaps means it sets the address to 0 and marks the page as not present. /// </para> /// <para> /// It is common to call this with just UpdateUsedPages set to Virtual, since then the virtual page becomes available for use /// but the physical page remains reserved (though unmapped). /// </para> /// </remarks> /// <param name="vAddr">The virtual address of the page to unmap.</param> /// <param name="UpdateUsedPages">Which, if any, of the physical and virtual used pages lists to update.</param> public static void Unmap(void *vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { Unmap((uint)vAddr, UpdateUsedPages); }
/// <summary> /// Maps the specified amount of memory. /// </summary> /// <param name="pAddr">The physical address to start mapping at (must be 4KiB aligned).</param> /// <param name="vAddr">The virtual address to start mapping at (must be 4KiB aligned).</param> /// <param name="size">The amount of memory (in bytes) to map (must be a multiple of 4KiB)</param> /// <param name="flags">The flags to apply to the allocated pages.</param> /// <param name="UpdateUsedPages">Which, if any, of the physical and virtual used pages lists to update.</param> public static void Map(uint pAddr, uint vAddr, uint size, VirtMemImpl.PageFlags flags, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { flags |= VirtMemImpl.PageFlags.Present | VirtMemImpl.PageFlags.Writeable; while (size > 0) { impl.Map(pAddr, vAddr, flags, UpdateUsedPages); size -= 4096; pAddr += 4096; vAddr += 4096; } }
/// <summary> /// Maps the specified amount of memory. /// </summary> /// <param name="pAddr">The physical address to start mapping at (must be 4KiB aligned).</param> /// <param name="vAddr">The virtual address to start mapping at (must be 4KiB aligned).</param> /// <param name="size">The amount of memory (in bytes) to map (must be a multiple of 4KiB)</param> /// <param name="flags">The flags to apply to the allocated pages.</param> /// <param name="UpdateUsedPages">Which, if any, of the physical and virtual used pages lists to update.</param> public static void Map(void *pAddr, uint vAddr, uint size, VirtMemImpl.PageFlags flags, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { Map((uint)pAddr, vAddr, size, flags, UpdateUsedPages); }
/// <summary> /// Maps the specified virtual address to the specified physical address. /// </summary> /// <param name="pAddr">The physical address to map to.</param> /// <param name="vAddr">The virtual address to map.</param> /// <param name="flags">The flags to apply to the allocated pages.</param> /// <param name="UpdateUsedPages">Which, if any, of the physical and virtual used pages lists to update.</param> public abstract void Map(uint pAddr, uint vAddr, PageFlags flags, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both);
public static void Unmap(uint vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { impl.Unmap(vAddr, UpdateUsedPages); }
/// <summary> /// Maps the specified amount of memory. /// </summary> /// <param name="pAddr">The physical address to start mapping at (must be 4KiB aligned).</param> /// <param name="vAddr">The virtual address to start mapping at (must be 4KiB aligned).</param> /// <param name="size">The amount of memory (in bytes) to map (must be a multiple of 4KiB)</param> public static void Map(uint pAddr, void* vAddr, uint size, VirtMemImpl.PageFlags flags, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { Map(pAddr, (uint)vAddr, size, flags, UpdateUsedPages); }
public override void Unmap(uint vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { //if (Unmap_Print) //{ // BasicConsole.WriteLine("Getting physical addr..."); //} uint pAddr = GetPhysicalAddress(vAddr); //if (Unmap_Print) //{ // BasicConsole.WriteLine("Calculating virt addr parts..."); //} uint virtPDIdx = vAddr >> 22; uint virtPTIdx = (vAddr >> 12) & 0x03FF; //if (Unmap_Print) //{ // BasicConsole.WriteLine("Calculating phys addr parts..."); //} uint physPDIdx = pAddr >> 22; uint physPTIdx = (pAddr >> 12) & 0x03FF; //if (Unmap_Print) //{ // BasicConsole.WriteLine("Checking flags & stuff..."); //} if ((UpdateUsedPages & UpdateUsedPagesFlags.Physical) != 0) { UsedPhysPages.Clear((int)((physPDIdx * 1024) + physPTIdx)); } if ((UpdateUsedPages & UpdateUsedPagesFlags.Virtual) != 0) { UsedVirtPages.Clear((int)((virtPDIdx * 1024) + virtPTIdx)); } //if (Unmap_Print) //{ // BasicConsole.WriteLine("Getting page table..."); //} uint* virtPTPtr = GetFixedPage(virtPDIdx); //if (Unmap_Print) //{ // BasicConsole.WriteLine("Setting page entry..."); //} SetPageEntry(virtPTPtr, virtPTIdx, 0, PTEFlags.None); //if (Unmap_Print) //{ // BasicConsole.WriteLine("Invalidating page table entry..."); //} InvalidatePTE(vAddr); }