首页/新闻资讯/正文详情

init INIT_PGD_PAGE_COUNT

发布时间:2026/9/26 8:22:51 来源:云帆数科 栏目:资讯中心
init INIT_PGD_PAGE_COUNT
INIT_PGD_PAGE_COUNT是 Linux 内核 x86 架构启动过程中定义的一个宏它规定了早期页表缓冲区pgt_buf可以容纳的页表页数量。这个缓冲区在系统启动早期、正式的内存分配器如伙伴系统尚未就绪时为建立初始内核页表提供内存。核心定义与用途在arch/x86/mm/init.c中你可以找到类似这样的代码片段展示了该宏的完整定义和使用方式/* 根据是否启用5级页表定义每个映射层级所需的页表页数 */ #ifndef CONFIG_X86_5LEVEL #define INIT_PGD_PAGE_TABLES 3 #else #define INIT_PGD_PAGE_TABLES 4 #endif /* 根据是否启用KASLR计算总页表页数 */ #ifndef CONFIG_RANDOMIZE_MEMORY #define INIT_PGD_PAGE_COUNT (2 * INIT_PGD_PAGE_TABLES) #else #define INIT_PGD_PAGE_COUNT (4 * INIT_PGD_PAGE_TABLES) #endif #define INIT_PGT_BUF_SIZE (INIT_PGD_PAGE_COUNT * PAGE_SIZE) RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE);所以它主要是一个编译期的配置参数用来决定启动早期页表缓冲区的大小而不是在某个运行时函数里被频繁调用。根据内核源码中的提交记录INIT_PGD_PAGE_COUNT的定义经历了演进其核心目的是为启动早期必须建立的页表预留足够的内存。在较早的内核版本中相关的宏是INIT_PGT_BUF_SIZE它被定义为(6 * PAGE_SIZE)。后来这个宏被替换为更清晰的INIT_PGD_PAGE_COUNT并配合RESERVE_BRK机制来预留内存#define INIT_PGD_PAGE_COUNT 6 #define INIT_PGT_BUF_SIZE (INIT_PGD_PAGE_COUNT * PAGE_SIZE) RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE);为什么是 6 个页面INIT_PGD_PAGE_COUNT的值如 6并非随意设定它是为了满足启动早期最基础的地址映射需求。根据内核文档的描述这 6 个页面用于满足两类关键的早期映射ISA 映射1 MiB为传统的 ISA 设备如 VGA、键盘控制器在低端内存建立映射。首个直接映射2 MiB建立内核直接映射区的第一个 2 MiB 映射。为了建立这两类映射至少需要分配 PUD、PMD、PTE 三个层级的页表。由于在某些场景下如启用 KASLR映射可能更复杂或需要重复分配因此这个数量通常会被翻倍最终定为 6 个页面。5级页表的适配与动态扩展随着硬件的发展这个固定值也遇到了挑战5级页表的需求对于支持 5 级页表5-level paging的 CPU地址空间从 48 位扩展到 57 位这需要在 PUD 之上增加一个P4D层级。因此内核提交了补丁将INIT_PGD_PAGE_COUNT的值翻倍以容纳这个额外的页表层级。大内存机器的边界情况即使初始值被翻倍对于拥有超大物理内存如 512 GiB的机器如果内核使用 4 KiB 页面首次直接映射可能需要跨越多个 PGD 条目导致预留的页表缓冲区不足。内核文档指出在这种情况下可能还需要额外 3 到 4 个页表页。这说明INIT_PGD_PAGE_COUNT是一个在通用性与极端情况之间权衡的静态估算值并非在所有硬件配置下都绝对充裕。使用链路它最核心的用途是配合INIT_PGT_BUF_SIZE宏为RESERVE_BRK预留一块用于早期页表分配的内存。定义与计算该宏定义了初始页表所需的页表页数量。其值会根据是否启用 KASLR内存随机化和 5 级页表支持而动态调整。内存预留计算出的INIT_PGT_BUF_SIZE会被RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE)使用在内核启动早期从brk区域预留出这块内存专门用于分配页表。定义缓冲区大小INIT_PGT_BUF_SIZE通过INIT_PGD_PAGE_COUNT计算得出决定了需要为早期页表预留多少内存。#define INIT_PGT_BUF_SIZE (INIT_PGD_PAGE_COUNT * PAGE_SIZE)预留内存 (BRK)紧接着RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE)宏会在内核镜像的brk区域预留出这块内存。brk区域是内核镜像的一部分在启动早期必然被映射因此可以作为页表分配的“启动资本”。初始化缓冲区指针在setup_arch()函数中会调用early_alloc_pgt_buf()。这个函数负责初始化几个关键的全局变量pgt_buf_start、pgt_buf_end、pgt_buf_top将预留的brk内存正式纳入页表分配器的管理。供分配器使用之后当alloc_low_page()函数需要分配页表页时它会优先从pgt_buf这个缓冲区中取用内存直到耗尽。耗尽后才会转向memblock去查找更多已映射的内存。

相关推荐

废弃炼油厂拍摄全攻略:安全踩点、构图思路与后期调色
废弃炼油厂拍摄全攻略:安全踩点、构图思路与后期调色

1. 场景定位与拍摄价值:为什么要拍废弃炼油厂把“外景”和“废弃炼油工厂”组合在一起,是我近几年拍过最有“性价比”的户外场景类型。第一次踩点时,我心里其实很没底——这种地方交通不便、气味刺鼻、地面状况不明,怎么看都不是一… · 2026/9/26 8:22:45

Substrate作为可验证状态机操作系统:支撑AI Agent可信执行
Substrate作为可验证状态机操作系统:支撑AI Agent可信执行

1. 项目概述:Substrate 不是“另一个区块链框架”,而是可验证计算的底层操作系统你搜“substrate”时,首页跳出来的几乎全是“波卡生态”“平行链开发”“Rust写链”——这没错,但严重窄化了它的本质。我从2019年Substrate 1.0发布… · 2026/9/26 8:22:45

鲁棒自适应动态规划仿真代码实战:从环境配置到参数调优
鲁棒自适应动态规划仿真代码实战:从环境配置到参数调优

简介:基于一篇控制领域期刊论文的鲁棒自适应动态规划仿真代码包,面向控制理论、机器学习与智能优化领域的学者和工程师,用于解决系统存在外部扰动、参数变化等不确定性时的控制器设计问题,尤其适合非线性与复杂动态系统。压缩包共… · 2026/9/26 8:22:45

open-code-review:用AI预审与静态规则打造高效代码评审工作流
open-code-review:用AI预审与静态规则打造高效代码评审工作流

1. 为什么要做open-code-review:评审这件事,卡在哪了先聊点实在的。代码评审,也就是code review,本该是保证代码质量的最后一道关卡,但真在团队里跑过流程的人都知道,这里面的问题比代码里的bug还多。我刚接… · 2026/9/26 8:58:40

科研论文术语解析:彻底搞懂Baseline与Pipeline
科研论文术语解析:彻底搞懂Baseline与Pipeline

2. 科研论文术语全解析:彻底搞懂Baseline与Pipeline搞科研的人,十有八九都遇到过这种尴尬场景:导师甩过来一篇顶会论文,让你先看看Baseline和Pipeline,你翻开正文找了半天,越看越迷糊。明明每个单词都认识&… · 2026/9/26 8:58:40

Python端到端世界杯数据分析项目:爬虫清洗建模可视化全链路实战
Python端到端世界杯数据分析项目:爬虫清洗建模可视化全链路实战

简介:这是一份面向Python初学者与数据分析爱好者的实战教学资料,聚焦体育赛事预测场景,通过真实世界杯历史数据(1872–2018年约4万场)训练数据清洗、分组统计、可视化及逻辑判断等核心技能。资源为单文件PDF教程&#… · 2026/9/26 8:58:33

PyTorch 1.3深度解析:命名张量、量化与移动端部署实战
PyTorch 1.3深度解析:命名张量、量化与移动端部署实战

1. 从一次版本更新说起:为什么PyTorch 1.3值得单独拿出来聊2019年10月,PyTorch 1.3正式发布。如果你当时正在用PyTorch做研究或者跑生产任务,这个版本号可能只是你conda update时顺手升上去的一个数字。但如果你回头去看这个版本带来的东西—… · 2026/9/26 8:58:33

烟雾检测数据集全攻略:10000张图+三格式标签+划分脚本+训练教程
烟雾检测数据集全攻略:10000张图+三格式标签+划分脚本+训练教程

简介:本资源为面向目标检测初学者与算法工程师的YOLO烟雾目标检测数据集,聚焦真实场景下的烟雾识别任务,可用于安防监控、工业巡检、火灾预警等方向的模型训练与课程实践。数据经labelimg精细标注,标注框质量高,场景覆… · 2026/9/26 8:58:33

模型量化全解析:从INT8校准到QAT与LLM部署优化
模型量化全解析:从INT8校准到QAT与LLM部署优化

1. 量化是部署优化里回报最高的一刀 做推理优化的人,迟早会撞上“量化”这个词。我第一次被量化逼着动手,是在一个边缘盒子的项目里:模型 FP32 跑一遍要 40ms,客户却要求 10ms 以内,内存只给了 512MB。最后把主要算子切… · 2026/9/26 8:58:27

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码