コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
ファイル: VirtMemManager.cs プロジェクト: kztao/FlingOS
 public static void Unmap(void* vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both)
 {
     Unmap((uint)vAddr, UpdateUsedPages);
 }
コード例 #5
0
ファイル: VirtMemManager.cs プロジェクト: kztao/FlingOS
 /// <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;
     }
 }
コード例 #6
0
ファイル: VirtMemImpl.cs プロジェクト: zrbruce/FlingOS
 public virtual void Map(uint pAddr, uint vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both)
 {
     Map(pAddr, vAddr, PageFlags.Present | PageFlags.KernelOnly | PageFlags.Writeable, UpdateUsedPages);
 }
コード例 #7
0
ファイル: x86.cs プロジェクト: rmhasan/FlingOS
        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);
        }
コード例 #8
0
ファイル: x86.cs プロジェクト: kztao/FlingOS
        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);            
        }
コード例 #9
0
ファイル: VirtMemImpl.cs プロジェクト: rmhasan/FlingOS
 /// <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);
コード例 #10
0
ファイル: VirtMemManager.cs プロジェクト: zrbruce/FlingOS
 /// <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);
 }
コード例 #11
0
ファイル: VirtMemManager.cs プロジェクト: zrbruce/FlingOS
 /// <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);
 }
コード例 #12
0
ファイル: VirtMemManager.cs プロジェクト: zrbruce/FlingOS
 /// <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;
     }
 }
コード例 #13
0
ファイル: VirtMemManager.cs プロジェクト: zrbruce/FlingOS
 /// <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);
 }
コード例 #14
0
ファイル: VirtMemImpl.cs プロジェクト: zrbruce/FlingOS
 /// <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);
コード例 #15
0
ファイル: VirtMemManager.cs プロジェクト: kztao/FlingOS
 public static void Unmap(uint vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both)
 {
     impl.Unmap(vAddr, UpdateUsedPages);
 }
コード例 #16
0
ファイル: VirtMemManager.cs プロジェクト: kztao/FlingOS
 /// <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);
 }
コード例 #17
0
ファイル: VirtMemImpl.cs プロジェクト: rmhasan/FlingOS
 public virtual void Map(uint pAddr, uint vAddr, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both)
 {
     Map(pAddr, vAddr, PageFlags.Present | PageFlags.KernelOnly | PageFlags.Writeable, UpdateUsedPages);
 }
コード例 #18
0
ファイル: x86.cs プロジェクト: rmhasan/FlingOS
 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);
 }
コード例 #19
0
ファイル: VirtMemImpl.cs プロジェクト: rmhasan/FlingOS
 /// <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);
コード例 #20
0
ファイル: x86.cs プロジェクト: rmhasan/FlingOS
        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);            
        }
コード例 #21
0
ファイル: VirtMemImpl.cs プロジェクト: zrbruce/FlingOS
 /// <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);