You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Linux内核需用page_address()映射物理页至虚拟地址?

内核中pkmap_page_table与page_address()的差异与必要性

你忽略的核心是两者的定位和适用场景完全不同,具体来说:

  • pkmap_page_table只是高端内存临时映射的底层页表载体
    它是内核专门用来映射高端物理内存页(即超出内核直接映射范围的物理内存)的固定页表区域,这个区域的虚拟地址空间有限,同一时间只能承载少量物理页的映射,而且映射是临时的——用完必须通过kunmap()释放,否则会占满这个有限空间。它只负责"存放"映射关系,不是给内核代码直接调用的接口。

  • page_address()是获取物理页对应虚拟地址的通用入口
    内核代码中经常会拿到struct page结构体(比如内存分配、页缓存操作时),但需要的是能直接访问的虚拟地址。page_address()会根据物理页的位置自动处理:

    • 如果是低地址物理页(处于内核直接映射区),直接通过地址偏移计算得到虚拟地址,根本不需要碰pkmap;
    • 如果是高端物理页,会检查该页是否已经通过pkmap或者原子映射(kmap_atomic())建立了虚拟映射,返回对应的地址;
    • 对特殊页(比如设备内存页、保留页)也能返回正确的虚拟地址。
  • 关键:映射的"前置性"与"通用性"
    拿到struct page不代表该页已经有可用的虚拟映射——比如刚从伙伴系统分配的高端物理页,还没通过kmap()建立pkmap映射。page_address()不仅是查询工具,还封装了不同内存区域的映射逻辑,让内核代码不用关心物理页属于哪个区域,就能统一获取可访问的虚拟地址,而pkmap_page_table只是这个逻辑中处理高端内存时用到的底层结构而已。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:36:15