PAE How to map the specific address?

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
nifanfa
Member
Member
Posts: 104
Joined: Tue Aug 17, 2021 10:40 am
Libera.chat IRC: visitor
Location: CN
Contact:

Re: PAE How to map the specific address?

Post by nifanfa »

deadmutex wrote:>and how i do i map the address like 0xFFFF_FFFF_FF00_0000 to 0xFFFF_FF00 ?

You'd translate the virtual address into its pml4e number, pdpte number, etc., and then set the entries appropriately.
does
page_dir[0] = 0b10000011; means map the 0-2mb?
and
page_dir[1] = 0b10000011; means map the 2-4mb?
nifanfa
Member
Member
Posts: 104
Joined: Tue Aug 17, 2021 10:40 am
Libera.chat IRC: visitor
Location: CN
Contact:

Re: PAE How to map the specific address?

Post by nifanfa »

Code: Select all

using Mosa.Kernel.x86;
using Mosa.Runtime;
using System.Runtime.InteropServices;

namespace MOSA1
{
    unsafe class PAE
    {
        [DllImport("PAE.o")]
        public static extern void PAE_ASM(uint ptr);

        public static void Initialize()
        {
            ulong* page_dir_ptr_tab = (ulong*)((uint)GC.AllocateObject((sizeof(ulong) * 4) + 0x20) & 0x20);

            ulong* page_dir0 = (ulong*)((uint)GC.AllocateObject((sizeof(ulong) * 512) + 0x1000) & 0x1000);
            ulong* page_dir1 = (ulong*)((uint)GC.AllocateObject((sizeof(ulong) * 512) + 0x1000) & 0x1000);
            ulong* page_dir2 = (ulong*)((uint)GC.AllocateObject((sizeof(ulong) * 512) + 0x1000) & 0x1000);
            ulong* page_dir3 = (ulong*)((uint)GC.AllocateObject((sizeof(ulong) * 512) + 0x1000) & 0x1000);

            page_dir_ptr_tab[0] = (ulong)page_dir0 | 1; // set the page directory into the PDPT and mark it present
            page_dir_ptr_tab[1] = (ulong)page_dir1 | 1; // set the page directory into the PDPT and mark it present
            page_dir_ptr_tab[2] = (ulong)page_dir2 | 1; // set the page directory into the PDPT and mark it present
            page_dir_ptr_tab[3] = (ulong)page_dir3 | 1; // set the page directory into the PDPT and mark it present

            for (ulong i = 1; i < 512; i++)
            {
                page_dir0[i] = 0b10000011;
                //page_dir1[i] = 0b10000011;
                //page_dir2[i] = 0b10000011;
                //page_dir3[i] = 0b10000011;
            }

            PAE_ASM((uint)page_dir_ptr_tab);

            Console.WriteLine("PAE(Physical Address Extension) Configuration Done");

            //Native.SetCR0(Native.GetCR0() | 0x80000000);
        }
    }
}

Code: Select all

[bits 32]
	mov eax, cr4
	or eax, 1 << 5
	mov cr4, eax
	mov eax, [esp + 4]
	mov cr3, eax
	mov eax, cr0
	or eax, 0x80000000
	mov cr0, eax
	ret
nifanfa
Member
Member
Posts: 104
Joined: Tue Aug 17, 2021 10:40 am
Libera.chat IRC: visitor
Location: CN
Contact:

Re: PAE How to map the specific address?

Post by nifanfa »

my code caused triple fault
User avatar
deadmutex
Member
Member
Posts: 85
Joined: Wed Sep 28, 2005 11:00 pm

Re: PAE How to map the specific address?

Post by deadmutex »

nifanfa wrote:

Code: Select all

            for (ulong i = 1; i < 512; i++)
            {
                page_dir0[i] = 0b10000011;
                //page_dir1[i] = 0b10000011;
                //page_dir2[i] = 0b10000011;
                //page_dir3[i] = 0b10000011;
            }
You're only setting the present, read-write, and page size flags for each entry of page_dir0, so only the first 2-MiB of physical memory is being mapped. You also have to set the base address for each 2 MiB page. See the wiki.
Post Reply