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

Linux内核struct page结构体存储位置及union字段作用咨询

关于Linux内核struct page的两个问题解答

1. struct page结构体的存储位置

Linux内核里每个物理页都对应一个struct page,这些结构体的集合被称为memmap(内存映射表),它们存储在内核专属的内存区域里,具体分两种情况:

  • 对于可以被内核直接永久映射的低内存区域(LOWMEM):memmap直接位于内核的直接映射地址空间中,内核能直接访问这些struct page;
  • 对于高端内存(HIGHMEM,无法被内核永久直接映射的内存):memmap依然存放在低内存的内核地址空间里——因为高端内存本身不能被内核随时访问,管理它的struct page必须放在内核能直接拿到的地方。

这些memmap是系统启动初期就分配好的,通常用bootmem或者早期的buddy系统预留空间,而且这个区域属于内核私有内存,用户空间完全无法直接访问。

2. struct page中union字段的作用

这个union字段的核心作用是内存空间复用,本质是为了节省内核内存——毕竟系统里有多少物理页就有多少struct page,哪怕每个结构体少占几个字节,整体节省的内存量都很可观。

因为一个物理页在同一时刻只会扮演一种角色:要么是页缓存/匿名页、要么是网络栈用的page_pool页、要么是slab分配器的slab页、要么是复合页的尾页、要么是页表页、要么是ZONE_DEVICE设备页。union正好让这些不同角色需要的字段共用同一块内存空间:

  • 当页作为页缓存或匿名页时,会使用union里的lru、mapping、index等字段;
  • 当页被slab分配器管理时,就切换到使用slab_list、slab_cache、freelist这些字段;
  • 要是页是复合页的尾页,就用compound_head、compound_order这些字段。

这种设计既保证了不同场景下都有足够的字段管理页,又不会因为给每个页预留所有场景的字段而浪费大量内存。

内容的提问来源于stack exchange,提问作者H.Potter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:27:56