Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Apr 2012 11:42:04 -0500
From:      Mark Tinguely <marktinguely@gmail.com>
To:        vasanth rao naik sabavat <vasanth.raonaik@gmail.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: question about amd64 pagetable page allocation.
Message-ID:  <CAP%2BM-_E%2BwsDRPd6JiO4M-MEsYERnGcA-oR-ckWAeEE7kWwrfmw@mail.gmail.com>
In-Reply-To: <CAAuizBh0M_wpUvWU%2B0-CMC9XveqQNXOqtB92NhABnGGUVuq4DQ@mail.gmail.com>
References:  <CAAuizBhUuWvbYjZewO5LgHPuGfi37mW0sJFAKs-YN-G1ZbNAUQ@mail.gmail.com> <CAP%2BM-_Es5A3a0%2BcM6K=qi_kbk0ftnHHmZoazuerhg3TxrVr6SA@mail.gmail.com> <CAAuizBh0M_wpUvWU%2B0-CMC9XveqQNXOqtB92NhABnGGUVuq4DQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Apr 3, 2012 at 10:18 AM, vasanth rao naik sabavat
<vasanth.raonaik@gmail.com> wrote:
> Hello Mark,
>
> Thank you for replying,
>
> Could you please point me to any document which illustrates the
> implementation of recursive page tables in FreeBSD for amd64.
>
> Also, I just found that with the following patch from Alon, the usage of
> vtopte() is removed in pmap_remove_pages(). Why was this removed?
>
> http://lists.freebsd.org/pipermail/svn-src-all/2009-March/006006.html
>
> Thanks,
> Vasanth
>
> On Tue, Apr 3, 2012 at 10:56 AM, Mark Tinguely <marktinguely@gmail.com>
> wrote:
>>
>> On Tue, Apr 3, 2012 at 8:33 AM, vasanth rao naik sabavat
>> <vasanth.raonaik@gmail.com> wrote:
>> > Hi,
>> >
>> > I am trying to understand the page table page allocation for a process
>> > in
>> > FBSD6.1. I see that the page table pages are allocated by
>> > vm_page_alloc().
>> > I believe the virtual address for this allocated page can be derived b=
y
>> > PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)), however when I compare this address
>> > with
>> > the virtual address accessed in pmap_remove_pages() they are not the
>> > same.
>> >
>> > The virtual address of a *PTE in pmap_remove_pages() is something like
>> > *0xffff800000643200
>> > *
>> > However, the virtual address of the page allocated by vm_page_alloc() =
is
>> > =A0*
>> > 0xffffff033c6a0000
>> >
>> > *I would also like to understand the importance of loc_PTmap, I believ=
e
>> > the
>> > pmap_remove_pages() is derving the page table page addresses from
>> > loc_PTmap?
>> > (kgdb) p loc_PTmap
>> > Cannot access memory at address 0xffff800000000000
>> >
>> > How do we relate the loc_PTmap to the page table pages allocated by
>> > vm_page_alloc() in _pmap_allocpte().
>> >
>> > Thanks,
>> > Vasanth
>>
>>
>>
>> The answer to your questions will be more obvious when you get an
>> understanding of the Recursive Page Tables.
>>
>> --Mark Tinguely.
>
>

Search for "recursive page tables" start with 32 bits first. I did not
read it, but the below page looks promising:

http://www.rohitab.com/discuss/topic/31139-tutorial-paging-memory-mapping-w=
ith-a-recursive-page-directory/

The nice thing about recursive page table is the MMU does the work. But:

1) User recursive page tables work only for the current map.
2) Kernel mappings are placed at the top of every map - so the kernel
    recursive addresses will always be valid.

As the comment in the link states, that change converted from using
user recursive page table virtual address (which is only valid when
the map is current) to using the physical to virtual direct map (which
is always valid).

--Mark Tinguely.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAP%2BM-_E%2BwsDRPd6JiO4M-MEsYERnGcA-oR-ckWAeEE7kWwrfmw>