新闻详情

新闻详情

首页 / 资讯中心 / 详情

init init_range_memory_mapping

发布时间:2026/11/13 8:21:26来源:尧图网络
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

相关资讯

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

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/13 0:43:49

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/12 23:59:09

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/12 9:50:02

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/12 9:25:38

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/12 15:57:44

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/13 0:02:27

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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