early_alloc_pgt_buf early_alloc_pgt_buf()是 Linux 内核启动早期在setup_arch()中被调用的一个关键函数。它的核心作用非常直接为内核初始化阶段建立直接内存映射direct mapping所需的早期页表分配一个临时的内存池buffer。页表内存池的来源BRK 区域这个页表内存池的物理内存来自内核的BRKBreak区域。你可以把BRK区域理解为内核启动早期的一段动态内存空间。预留空间代码通过RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE)宏在链接脚本定义的 BRK 区域中为页表池预留了一块空间。这个预留的大小由INIT_PGT_BUF_SIZE定义在不同版本的内核中其值有所调整例如曾经从5 * PAGE_SIZE增加到12 * PAGE_SIZE以满足更复杂的映射需求。分配与初始化early_alloc_pgt_buf()函数通过调用extend_brk()从刚才预留的 BRK 区域中“切出”所需的内存并将其地址转换为物理地址用来初始化几个关键的全局变量pgt_buf_start页表池的起始物理页号PFN。pgt_buf_end当前已使用的页表池尾部的物理页号初始时与pgt_buf_start相同表示尚未使用。pgt_buf_top页表池的结束物理页号即内存池的边界。角色与运作一个临时的“内存批发商”early_alloc_pgt_buf()初始化完成后内核就拥有了一个暂时的“页表批发商”其运作方式如下优先使用 BRK 池在初始化init_mem_mapping()等需要建立内核页表的过程中分配页表例如通过alloc_low_pages()函数会优先从这个 BRK 内存池中获取空间。一个典型的注释提到“step_size need to be small so pgt_buf from BRK could cover it”步进值需要足够小以便 BRK 中的 pgt_buf 能够覆盖它说明初期映射的粒度会受限于这个池的大小。耗尽可能后启用后备方案这个初始内存池的大小是有限的。当pgt_buf_end触及pgt_buf_top即池子被用完后内核后续若还需要分配新页表就会转而使用更通用的memblock分配器来获取内存。这确保了页表映射工作能够持续进行。特殊的“免重叠”保护代码中有一个名为can_use_brk_pgt的标志其设计初衷是为了避免用 BRK 池中的页表去映射它自身所在的内存区域以防止可能出现的 MMU 问题。不过也有讨论认为这种担心在当前实现下可能已不再必要。early_alloc_pgt_buf()函数的代码实现非常简洁其核心逻辑是在 Linux 内核启动早期从内核的 BRK 区域分配一块连续内存作为构建初始页表的内存池。这个分配动作是一次性的并有相应的防重复机制。代码位置与数据结构该函数定义在arch/x86/mm/init.c文件中其实现依赖于三个关键的全局变量static unsigned long pgt_buf_start, pgt_buf_end, pgt_buf_top;pgt_buf_start记录页表内存池的起始页帧号 (PFN)。pgt_buf_end记录当前已使用的内存池末尾页帧号 (PFN)初始时与pgt_buf_start相等。pgt_buf_top记录内存池的结束页帧号 (PFN)即内存池的边界。代码实现演变该函数的定义在不同内核版本中有所变化主要区别在于池的大小和防重复逻辑。初始版本在最初引入该功能时代码相对简单RESERVE_BRK(early_pgt_alloc, 16384); void __init early_alloc_pgt_buf(void) { unsigned long tables 16384; phys_addr_t base; base __pa(extend_brk(tables, PAGE_SIZE)); pgt_buf_start base PAGE_SHIFT; pgt_buf_end pgt_buf_start; pgt_buf_top pgt_buf_start (tables PAGE_SHIFT); }内存池大小固定此处通过RESERVE_BRK在 BRK 区域预占了 16KB即 4 个页面的空间。通过extend_brk分配extend_brk(tables, PAGE_SIZE)从预留的 BRK 区域中“切出”所需内存并返回其虚拟地址。转换为物理地址__pa()负责将此虚拟地址转换为物理地址base。计算页帧号将物理地址base除以页大小PAGE_SHIFT得到起始页帧号并相应计算出结束页帧号pgt_buf_top。演进版本随后的补丁对该函数进行了完善主要是增加了缓冲区大小和防重复调用的保护。/* need 4 4k for initial PMD_SIZE, 4k for 0-ISA_END_ADDRESS, 4 4k for kernel */ #define INIT_PGT_BUF_SIZE (9 * PAGE_SIZE) RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE); void __init early_alloc_pgt_buf(void) { unsigned long tables INIT_PGT_BUF_SIZE; phys_addr_t base; /* already set ? */ if (pgt_buf_end) return; base __pa(extend_brk(tables, PAGE_SIZE)); pgt_buf_start base PAGE_SHIFT; pgt_buf_end pgt_buf_start; pgt_buf_top pgt_buf_start (tables PAGE_SHIFT); }INIT_PGT_BUF_SIZE宏为了满足更复杂的早期内存映射需求如内核本身的映射池的大小从最初的 16KB 增加到了9 个页面。历史补丁记录显示这个值是根据需求动态调整的例如在特定配置下从 5 个页面增加到 6 个页面。防重复调用检查添加了if (pgt_buf_end) return;判断。如果pgt_buf_end非零说明缓冲池已被分配函数会直接返回避免了重复分配导致的内存浪费或指针异常。函数的作用与背景early_alloc_pgt_buf()创建的内存池为紧接着执行的init_mem_mapping()函数提供了构建初始页表所需的内存。init_mem_mapping()会调用alloc_low_pages()来分配页表页而该分配器会优先从这个 BRK 内存池中获取空间。一个相关的注释提到“step_size need to be small so pgt_buf from BRK could cover it”说明了早期映射的粒度step_size会受到这个池子大小的制约以确保初期映射能在这个有限的缓冲区中完成。它的代码实现十分精巧通过RESERVE_BRK预先在链接脚本层面“圈地”再通过extend_brk在运行时“挂牌”最终为内核页表搭建了一个早期、临时的“工作台”。

相关新闻

最新新闻

具身智能精密装配赛上位机开发:TCP通讯、协议解析与实时调度实战指南

具身智能精密装配赛上位机开发:TCP通讯、协议解析与实时调度实战指南

1. 先搞清楚“具身智能精密装配赛”到底要解决什么问题看到“具身智能精密装配赛”这个标题,很多人的第一反应可能是“这比赛要用机器人做装配”,然后就开始琢磨机械臂、视觉算法或者强化学习。但结合“线下赛区需要智能体上位机教学及tcp通讯”这个关键…

2026/8/26 0:00:17
缓存穿透、击穿与雪崩:原理、区别与Spring Boot+Redis实战解决方案

缓存穿透、击穿与雪崩:原理、区别与Spring Boot+Redis实战解决方案

大家好,我是专注于后端技术分享的博主。在构建高并发系统时,缓存是提升性能、保护数据库的利器。然而,如果使用不当,缓存也可能成为系统稳定性的“阿喀琉斯之踵”。缓存穿透、击穿和雪崩是三个高频出现且极易混淆的故障场景&#…

2026/8/26 0:00:17
免费AI大模型调教指南:打造专属网文写作助手

免费AI大模型调教指南:打造专属网文写作助手

1. 先搞清楚“AI小说扩展模式”到底能帮你做什么如果你是一个刚开始写网文、或者卡在L3级别以下的作者,最头疼的可能是情节推进不下去、人物对话干瘪,或者世界观设定不够丰满。自己对着空白文档硬憋,效率很低。这时候,一个能理解你…

2026/8/26 0:00:17
Hermes接入团队协作后,我推翻了三个效率假设

Hermes接入团队协作后,我推翻了三个效率假设

聊《Hermes真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要团队把 Hermes 接进项目三个月后,交付速度没有提升反而慢了。复盘后发现,最先…

2026/8/26 0:00:17
Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:17
基于Hadoop大数据的微博舆情分析可视化系统(源码+lw+部署文档+讲解等)

基于Hadoop大数据的微博舆情分析可视化系统(源码+lw+部署文档+讲解等)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/25 23:55:17