Xen on Arm64启动页表设置疑问:映射逻辑与术语困惑
解答:Xen on Arm64 boot.S中create_page_tables函数的两个疑问
问题1:L3表索引映射逻辑的困惑
create_page_tables是Xen Arm64早期启动阶段的临时页表初始化函数,核心作用是把Xen的物理加载区域映射到虚拟地址空间,为后续从物理地址切换到虚拟地址运行做准备。
针对你给出的场景(物理起始地址x19=0x00100000,虚拟起始地址XEN_VIRT_START=0x00100000),要实现物理地址与虚拟地址1:1映射,每一页的L3索引确实应为地址的[20:12]位,第一个页的索引计算为0x00100000 >> 12 & 0x1ff = 0x10。
如果观察到代码“将Xen文本和数据映射到L3表首个索引”,大概率是对代码逻辑的理解偏差:
- 检查页表填充逻辑(比如
map_pages函数):正规实现会基于虚拟地址计算L3索引,而非物理地址。典型的索引计算代码如下:lsr x4, x3, 12 // x3为当前虚拟地址,右移12位提取页号 and x4, x4, #0x1ff // 截取[20:12]位作为L3表索引 str x1, [x0, x4, lsl #3] // 将物理地址写入L3表的对应索引位置 - 若代码确实从索引0开始填充,说明该阶段的临时映射并非严格1:1,只是临时把Xen物理区域映射到虚拟地址低段,后续启动流程会重建正式页表修正映射关系。
问题2:“section map”与block mapping的关系及L3表项的块映射支持
术语对应:注释中的“section map”是Arm32时代的术语,在Arm64架构中完全等同于block mapping(块映射)。Xen早期代码可能沿用了Arm32的注释习惯,导致术语差异。
L3表项的块映射支持:在4KB页表颗粒度的Arm64架构中,L3表项仅支持4KB页映射,不支持块映射。块映射只能通过L1表项(对应1GB块)或L2表项(对应2MB块)实现——因为L3是最底层页表,没有更下层的表结构,只能映射最小粒度的4KB页。
若注释中的“section map”指向L3表操作,要么是注释过时,要么是代码针对非默认的页表颗粒度(比如16KB或64KB)编写:在16KB颗粒度下,L3表项可映射2MB块,但Xen Arm64默认采用4KB颗粒度。
内容的提问来源于stack exchange,提问作者baonguyen2604
相关产品推荐
相关产品推荐

