x64 traditional paging
- VA -> PA translation
- When a processor needs to access a given VA,
va
, the processor does the following to translate it to a PA:- Locates the top level paging structure, PML4, from the value in the
CR3
register - Indexes the PML4 using
va[47:39]
as an index - Locates the next level paging structure, PDPT, from the indexed PML4 entry
- Indexes the PDPT using
va[38:30]
as an index - Locates the next level paging structure, PD, from the indexed PDPT entry
- Indexes the PD using
va[29:21]
as an index - Locates the next level paging structure, PT, from the indexed PD entry
- Indexes the PT using
va[20:12]
as an index - Finds out a page frame to translate to, from the indexed PT entry
- Combines the page frame and
va[11:0]
, resulting in a PA
- Locates the top level paging structure, PML4, from the value in the
- In pseudo code, it looks like this:
# Translate VA to PA def translate_va(va): i4, i3, i2, i1, page_offset = get_indexes(va) pml4 = cr3() pdpt = pml4[i4] pd = pdpt[i3] pt = pd[i2] page_frame = pt[i1] return page_frame | page_offset # Get indexes and a page offset from the given address def get_indexes(address): i4 = (address >> 39) & 0b111_111_111 i3 = (address >> 30) & 0b111_111_111 i2 = (address >> 21) & 0b111_111_111 i1 = (address >> 12) & 0b111_111_111 page_offset = address & 0b111_111_111_111 return i4, i3, i2, i1, page_offset
- Intel: 📖Figure 4-8. Linear-Address Translation to a 4-KByte Page using 4-Level Paging
- AMD: 📖Figure 5-17. 4-Kbyte Page Translation-Long Mode 4-Level Paging