我正在尝试理解 Arm64 上 Xen 的开始日代码。在
create_page_tables
中的boot.S
函数中,有一部分我们尝试将Xen文本和数据映射到3级表中。
/* Map Xen */
adr_l x4, boot_third
lsr x2, x19, #THIRD_SHIFT /* Base address for 4K mapping */
lsl x2, x2, #THIRD_SHIFT
mov x3, #PT_MEM_L3 /* x2 := Section map */
orr x2, x2, x3
/* ... map of vaddr(start) in boot_third */
mov x1, xzr
1: str x2, [x4, x1] /* Map vaddr(start) */
add x2, x2, #PAGE_SIZE /* Next page */
add x1, x1, #8 /* Next slot */
cmp x1, #(XEN_PT_LPAE_ENTRIES<<3) /* 512 entries per page */
b.lt 1b
x19 存储
start
入口点的物理地址,这是Xen文本的开始。我在这里感到困惑的是我们将 Xen 逐页映射到 L3 表的第一个索引,而没有考虑 L3 表索引。
例如,如果 x19 是
0x00100000
,我们是否必须从索引 0x10
开始映射,因为 L3 索引是位 [20:12],假设 4KB 颗粒大小?
还有一点不太明白,评论说我们是“section map”,是不是等同于“block mapping”?这在 L3 表中不是不可能的,因为 L3 条目必须是页面条目吗?
我在这里缺少什么?提前致谢!