x86 建页表的对齐问题

页表根据需求可建立不同大小,比如 4K(1000h byte), 2M (20_0000h byte), 1G(4000_0000h byte).
例如我们现在分别建立 4K, 2M, 1G 大小的页表,
;random ( memory, linear: x86_page_va equ (rand1 & 0ffffffff0000), physical: x86_page_pa equ (rand1 & 0ffffffff0000), a000h, if(MODE_PM64))
// 经过 random, 得到的 x86_page_va = 000004e0cf6be0000
// 接下来以x86_page_va 为基础分别创建 4K, 2M, 1G 大小的页表
;paging_entry x86_page_va -> x86_page_pa+1000h : user write present wb 4kbpage; create page-table
;paging_entry x86_page_va +3000h -> x86_page_pa+5000h : user write present wb 2mbpage; create page-table
;paging_entry x86_page_va + 40_0000h -> x86_page_pa+1000h : user write present wb 4kbpage; create page-table

原本期望的页表VA 范围为:
4K : 000004e0cf6be0000 -> 000004e0cf6be0fff
2M : 000004e0cf6c20000 -> 000004e0cf701ffff
1G : 000004e0cf6fe0000 -> 000004e0d36c1ffff

页表建立时,x86 会考虑对齐问题,比如 创建2M页表的时候,2M对齐, 自动忽略后21bit数值,默认为0。
因此,真正的建好的页表为:
4K : 000004e0cf6be0000 -> 000004e0cf6be0fff
2M : 000004e0cf6c00000 -> 000004e0cf6dfffff
1G : 000004e0c00000000 -> 000004e0effffffff

(写得匆忙,页表范围没double check, 可能有错误)

原文地址:https://www.cnblogs.com/yanli0302/p/14791145.html