新闻详情

新闻详情

首页 / 资讯中心 / 详情

init init_range_memory_mapping

发布时间:2026/9/25 4:28:48来源:尧图网络
init init_range_memory_mapping
init_range_memory_mapping是 x86 架构内核在启动时用于为一段指定的物理地址范围建立直接映射Direct Mapping的核心函数。它的核心作用是遍历 E820 内存映射表找出目标范围内所有真正可用的 RAM 区域跳过内存空洞和保留区域并只对这些区域建立页表映射。核心功能与设计意图这个函数并非简单地将[r_start, r_end)整段地址直接映射而是非常精细地处理了物理内存中可能存在的“空洞”。其设计意图在源码注释中说得非常清楚We need to iterate through the E820 memory map and create direct mappings for only E820_TYPE_RAM and E820_KERN_RESERVED regions. We cannot simply create direct mappings for all pfns from [0 to max_low_pfn) and [4GB to max_pfn) because of possible memory holes in high addresses that cannot be marked as UC by fixed/variable range MTRRs.也就是说物理地址空间中可能并非全是可用的 RAM中间会夹杂着保留区域或设备 MMIO 空洞。如果强行映射这些非 RAM 区域可能会因为缓存属性问题导致系统不稳定。因此init_range_memory_mapping会跳过这些空洞只映射真正的 RAM。函数逻辑逐行解析static unsigned long __init init_range_memory_mapping( unsigned long r_start, unsigned long r_end) { unsigned long start_pfn, end_pfn; unsigned long mapped_ram_size 0; int i; for_each_mem_pfn_range(i, MAX_NUMNODES, start_pfn, end_pfn, NULL) { u64 start clamp_val(PFN_PHYS(start_pfn), r_start, r_end); u64 end clamp_val(PFN_PHYS(end_pfn), r_start, r_end); if (start end) continue; can_use_brk_pgt max(start, (u64)pgt_buf_endPAGE_SHIFT) min(end, (u64)pgt_buf_topPAGE_SHIFT); init_memory_mapping(start, end); mapped_ram_size end - start; can_use_brk_pgt true; } return mapped_ram_size; }遍历 E820 内存范围for_each_mem_pfn_range宏会遍历内核维护的 E820 内存映射表e820_table逐项取出每一个可用的物理内存区域标记为E820_TYPE_RAM等的起始和结束页帧号PFN。裁剪到目标范围clamp_val将当前 E820 内存项的物理地址PFN_PHYS(start_pfn)和PFN_PHYS(end_pfn)裁剪到[r_start, r_end)这个目标范围内。这样做的目的是即使一个 E820 内存项只与目标范围部分重叠也能得到精确的交集。如果裁剪后start end说明该 E820 项与目标范围没有交集直接跳过。处理页表缓冲区冲突can_use_brk_pgt这个全局标志位用于判断当前要映射的内存区域是否与内核页表自身的临时缓冲区pgt_buf重叠。如果重叠就不能使用 BRK 区域来分配新的页表而必须从 memblock 分配器获取内存以防止自我覆盖导致的崩溃。建立映射对于裁剪后的有效区间调用init_memory_mapping(start, end)来完成实际的页表建立工作。该函数内部会根据地址对齐情况智能选择使用 4KB、2MB 或 1GB 的页面大小以最大化页表效率。统计与重置累加已映射的 RAM 大小到mapped_ram_size并在每次循环结束时将can_use_brk_pgt重置为true为处理下一个内存项做准备。在启动流程中的位置这个函数通常由init_mem_mapping()调用。init_mem_mapping会决定采用自顶向下top-down还是自底向上bottom-up的策略来扫描整个物理内存并分多次调用init_range_memory_mapping逐步为所有 RAM 建立直接映射。返回的mapped_ram_size用于判断映射进度并动态调整每次映射的步长step_size以平衡页表分配效率和内存占用。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

LangChain4j+LangGraph4j企业级智能工作流平台 2026/9/25 4:59:21

LangChain4j+LangGraph4j企业级智能工作流平台

1. 这不是又一个“拖拽画布AI调用”的玩具平台——它解决的是企业级工作流中真实存在的三重断层我去年在给一家中型制造企业的ERP做智能化升级时,被拉进一个持续三个月的跨部门扯皮会。业务方说:“我们要让采购审批自动识别合同里的交货期偏差&#xff0…

阅读更多 →
GLSL内置函数深度解析:从smoothstep到fwidth的实战指南 2026/9/25 4:59:21

GLSL内置函数深度解析:从smoothstep到fwidth的实战指南

前阵子调一个边缘光效的着色器,问题出在smoothstep的边界条件上:我图省事把两个edge参数传成了同一个值,结果在NVIDIA显卡上正常,在另一台AMD机器上直接出现整片闪烁。查来查去,最后老老实实打开《OpenGL Shading Lang…

阅读更多 →
treg 文档碎片维护指南:tools-registry-context 的同步工作流与防漂移设计 2026/9/25 4:59:20

treg 文档碎片维护指南:tools-registry-context 的同步工作流与防漂移设计

后端API网关MCP 服务dsh-plugin 【免费下载链接】treg OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn 项目地址: https://gitcode.com/GitHub_Trending/treg/treg 点击查看 免费下载 treg(Tools Registry&#xff0…

阅读更多 →
Nacos配置导入全攻略:ZIP、OpenAPI、SDK与跨集群同步 2026/9/25 4:59:14

Nacos配置导入全攻略:ZIP、OpenAPI、SDK与跨集群同步

做微服务的人,几乎都干过这么一件事:要换环境,或者新起一套Nacos集群,然后面对几十上百条配置,逐条复制粘贴,复制到怀疑人生。Nacos里的“配置导入”功能,就是专门解决这种“配置搬运”问题的&a…

阅读更多 →
xnbcli XACT音频模块前瞻:解析星露谷XGS/XSB音效库文件的完整指南 2026/9/25 4:59:14

xnbcli XACT音频模块前瞻:解析星露谷XGS/XSB音效库文件的完整指南

xnbcli XACT音频模块前瞻:解析星露谷XGS/XSB音效库文件的完整指南 【免费下载链接】xnbcli A CLI tool for XNB packing/unpacking purpose built for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/xn/xnbcli xnbcli 是一款专为《星露谷》打造…

阅读更多 →
Coze工作流实战:搭建AI智能体每日资讯自动生成流水线 2026/9/25 4:59:14

Coze工作流实战:搭建AI智能体每日资讯自动生成流水线

1. 从一条每日资讯说起:为什么我最终选择了Coze工作流每天早上八点,我手机里会准时弹出一条消息——一份排版整齐的AI行业资讯,包含当天的重要动态、产品更新和值得关注的技术趋势。很多朋友以为我雇了助理在整理,其实这条资讯从头…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉