#Linux内存管理# 假设设备上安装了一块2G的物理内存,在系统启动时,ARM Linux内核是如何映射的?

在ARM Linux系统启动过程中,对2GB物理内存的映射实现分为以下几个关键阶段:

 

一、设备树解析与内存信息获取

 

1.设备树定义

物理内存范围通过设备树(DTS)的memory节点定义,例如:

   memory@60000000 {

       device_type = "memory";

       reg = <0x60000000 0x80000000>; // 起始地址0x60000000,大小2GB

   };

作用:内核启动时通过early_init_dt_scan_memory()解析该节点,获取物理内存基地址(base)和大小(size)。

 

2.注册到memblock子系统

解析后的内存区域通过memblock_add()注册到内核早期内存管理器memblock中,临时管理物理内存分配。

 

二、初始页表建立(段映射阶段)

1.临时页表(swapper_pg_dir)

 

位置:物理内存16KB对齐区域,由汇编代码在head.S中初始化。

 

映射方式:采用段映射(Section Mapping),每个段1MB,直接映射物理地址到内核虚拟地址。

 

     // 物理地址0x60000000 → 虚拟地址0xC0000000(PAGE_OFFSET=3G)

     create_section_mapping(swapper_pg_dir, 0x60000000, 0xC0000000, 0x80000000);

  

2.映射范围

 

初始页表覆盖整个2GB物理内存,建立1:1线性映射(物理地址+3G偏移),确保内核启动时可直接访问所有内存。

 

确定映射偏移量(PAGE_OFFSET)

典型配置:内核虚拟地址偏移 PAGE_OFFSET = 0xC0000000。

物理地址 0x60000000 对应的内核虚拟地址为:

虚拟地址 = 物理地址 + (PAGE_OFFSET - PHYS_OFFSET)

其中 PHYS_OFFSET 是物理内存的起始地址(此处为 0x60000000)。

 

计算示例:

PAGE_OFFSET = 0xC0000000 // 内核空间起始地址

PHYS_OFFSET = 0x60000000 // 物理内存起始地址

虚拟地址偏移量 = PAGE_OFFSET - PHYS_OFFSET = 0xC0000000 - 0x60000000 = 0x60000000

 

因此,物理地址 0x60000000 对应的内核虚拟地址为:

0x60000000 + 0x60000000 = 0xC0000000

物理地址 0xE0000000(结束地址)对应的虚拟地址为:

0xE0000000 + 0x60000000 = 0x140000000(超过 32 位地址空间,需特殊处理)。

 

虚拟地址空间布局

内核空间:0xC0000000-0xFFFFFFFF(1GB,默认配置)。

若物理内存超过 1GB(如本例的 2GB),需调整 PAGE_OFFSET 或启用 HIGHMEM,但 ARMv7 通常不推荐此操作。

 

冲突处理:

当 PHYS_OFFSET + 内存大小 > PAGE_OFFSET + 1GB 时,内核会触发错误或截断映射。需确保设备树中 reg 范围与内核配置一致。

 

三、详细页表重构(paging_init阶段)

1.清除临时映射

 

在paging_init()函数中,调用memblock_free()释放临时页表占用的内存。

 

2.重构低端内存映射

 

函数路径:paging_init() → map_lowmem() → create_mapping()。

 

映射策略:

 

使用2MB大页(Huge Page)或4KB小页,替代初始的1MB段映射。

 

保留线性映射关系(phys_to_virt(addr) = addr + PAGE_OFFSET)。

 

3.高端内存处理(如适用)

若物理内存超过内核直接映射区(如32位系统默认896MB),超出部分标记为高端内存(Highmem),通过kmap()动态映射。

 

2GB内存案例:在32位ARM系统(内核空间1G)中,若配置为3:1划分,2GB物理内存需部分使用高端内存机制。

 

四、内存管理子系统初始化

1.伙伴系统接管

 

memblock将内存信息移交伙伴系统(Buddy System),完成精细化分页管理:

   start_kernel() → mm_init() → mem_init() → free_all_bootmem();

 

2.内存区域(Zone)划分

 

ZONE_NORMAL:直接映射的低端内存(如0x60000000-0xE0000000)。

 

ZONE_HIGHMEM:动态映射的高端内存(若存在)。

 

五、验证与调试

查看内核日志

   dmesg | grep "Memory" # 输出示例:

   # [0.000000] Memory: 2048MB/2048MB available

   

检查物理内存映射

   cat /proc/iomem | grep "System RAM"

   # 输出示例:

   # 60000000-7fffffff : System RAM

 

关键代码路径与配置文件阶段

关键函数/文件 作用

设备树解析 early_init_dt_scan_memory() 解析DTS内存节点

初始页表构建 arch/arm/kernel/head.S 创建临时段映射

详细页表重构 arch/arm/mm/mmu.c → map_lowmem() 建立低端内存永久映射

内存管理移交 mm/memblock.c → memblock_free() 释放临时页表,移交伙伴系统

 

实际映射策略可能因内核配置(如CONFIG_VMSPLIT调整用户/内核空间比例)或芯片架构差异而不同。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用MATIO库读取Matlab数据文件中的多维数组

使用MATIO库读取Matlab数据文件中的多维数组 MATIO是一个用于读写Matlab数据文件(.mat)的开源C库。下面是一个完整的示例程序&#xff0c;展示如何使用MATIO库读取Matlab数据文件中的多维数组。 示例程序 #include <stdio.h> #include <stdlib.h> #include <…

react+antd中做一个外部按钮新增 表格内部本地新增一条数据并且支持编辑删除(无难度上手)

需求背景 做一个可以外部控制新增刷新表格 表格内部可以编辑删除 类似下方需求图 实现过程 因为我实现时有两个这样的表格 所以我的事件里面会有传参用于判断 可忽略传参判断部分 代码中有formatMessage部分为国际化可忽略 <div style{{ marginBottom: 10px, margin…

【深度学习新浪潮】视觉与多模态大模型文字生成技术研究进展与产品实践

一、研究进展 跨模态架构创新 原生多模态模型:微软KOSMOS系列通过统一框架支持文本、图像、语音等多模态输入输出,实现跨模态推理与迁移。例如,KOSMOS-2.5可处理文本密集图像,生成结构化文本描述,并通过重采样模块优化视觉与语言的对齐。混合专家架构:第三代模型(如Deep…

重生之我是去噪高手——diffusion model

diffusion model是如何运作的&#xff1f; 想象一下&#xff0c;你有一张清晰的图片。扩散模型的核心思想分为两个过程&#xff1a; 前向过程&#xff08;Forward Process / Diffusion Process&#xff09;&#xff1a;逐步加噪反向过程&#xff08;Reverse Process / Denois…

华为项目管理“六步一法”方法论全解析:目标确认、项目活动分解与日事清系统协同

大家都知道&#xff0c;项目管理在现在各个行业里都是越来越重要了。 要是搞不好&#xff0c;项目就会拖沓&#xff0c;甚至走向失败。 今天咱们就来聊聊华为是怎么做项目管理的&#xff0c;比较知名的就是它们的“六步一法”。华为通过“六步一法”来进行项目管理&#xff0…

OpenCV 图形API(9)用于执行矩阵与标量之间的逐元素除法操作函数divC()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 矩阵除以标量。 该函数 divC 将矩阵 src 的每个元素除以给定的标量值&#xff1a; dst(I) saturate(src(I)*scale/divisor) \texttt{dst(I) s…

单例模式(懒汉模式/饿汉模式)

相关概念参考&#xff1a;【C】C 单例模式总结&#xff08;5种单例实现方法&#xff09;_单例模式c实现-CSDN博客 #include<iostream>class LazySingle{ public:static LazySingle& getInstance(){static LazySingle instance;return instance;}void hello(){std::c…

RocketMQ初认识

ProducerCustomerNameServer: Broker的注册服务发现中心BrokerServer:主要负责消息的存储、投递和查询以及服务高可用保证 RocketMQ的集群部署&#xff1a; 单个master的分支多个Master 模式&#xff1a;集群中有多个 Master 节点&#xff0c;彼此之间相互独立。生产者可以将消…

Maven/Gradle的讲解

一、为什么需要构建工具? 在理解 Maven/Gradle 之前,先明确它们解决的问题: ​​依赖管理​​:项目中可能需要引入第三方库(如 Spring、JUnit 等),手动下载和管理这些库的版本非常麻烦。​​标准化构建流程​​:编译代码、运行测试、打包成 JAR/WAR 文件等步骤需要自动…

基于SSM的车辆管理系统的设计与实现(代码+数据库+LW)

摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前企业对于车辆信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的管理模式已然落后。本人结…

嵌入式硬件篇---JSON通信以及解析

文章目录 前言一、JSON特点语法简单数据格式灵活轻量化跨语言使用二、JSON数据结构对象数组三、JSON在单片机之间通信的应用数据封装与传输四、JSON示例代码五、JSON在上位机与单片机之间通信的应用数据交互六、JSON示例代码七、JSON解析与生成解析生成八、Python中的数据解析1…

【C#】.net core 6.0 依赖注入常见问题之一,在构造函数使用的类,都需要注入到容器里,否则会提示如下报错,让DeepSeek找找原因,看看效果

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&#…

《P1072 [NOIP 2009 提高组] Hankson 的趣味题》

题目描述 Hanks 博士是 BT&#xff08;Bio-Tech&#xff0c;生物技术) 领域的知名专家&#xff0c;他的儿子名叫 Hankson。现在&#xff0c;刚刚放学回家的 Hankson 正在思考一个有趣的问题。 今天在课堂上&#xff0c;老师讲解了如何求两个正整数 c1​ 和 c2​ 的最大公约数…

nginx的自动跳转https

mkdir /usr/local/nginx/certs/ 创建一个目录 然后用openssl生成证书 编辑nginx的配置文件 自动跳转成功 做一个优化&#xff0c;如果访问的时候后面加了其他的uri也一起自动跳转了

力扣刷题——508.出现次数最多的子树和

给你一个二叉树的根结点 root &#xff0c;请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同&#xff0c;返回所有出现次数最多的子树元素和&#xff08;不限顺序&#xff09;。 一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和&…

2025/4/2 心得

第一题 题目描述 给定1001个范围在[1,1000]的数字&#xff0c;保证只有1个数字重复出现2次&#xff0c;其余数字只出现1次。试用O(n)时间复杂度来求出出现2次的这个数字。 不允许用数组 输入格式 第一行&#xff1a;一个整数1001&#xff1b; 第二行&#xff1a;1001个用…

0基础 | 硬件 | NE555芯片 二

目录 “双稳态电路之按键开关LED” 版本一&#xff1a; 版本二&#xff1a; “单稳态电路之延时自动关” 版本一 “无稳态电路之延时自动开关” 版本一&#xff1a; 版本二 “双稳态电路之按键开关LED” 版本一&#xff1a; 按键1 使2脚输入低电平&#xff0c;则3输出…

Python实现链接KS3,并将文件数据上传到KS3

前言 本文是该专栏的第55篇,后面会持续分享python的各种干货知识,值得关注。 说到KS3,首先想到的是金山云提供的对象存储服务。 相信或多或少的同学,在工作项目中也会遇到KS3相关的需求。比如说,现在有大批量的数据文件需要通过Python,上传到KS3中。对此,需要怎么去做…

小白 解析thingsboard 规则链节点

目录 1、filter(筛选器)节点内容 1. Alarm Status Filter(报警状态过滤器) 2. Check Fields Presence(检查字段存在性过滤器) 3. Check Relation Presence(检查关系存在性过滤器) 4. Entity Type Filter(实体类型过滤器) 5. Message Type Filter(消息类型过滤器…

PgVectore的使用

PgVectore的使用 一、PgVector的安装 参照博客&#xff1a;https://blog.csdn.net/u012953777/article/details/147013691?spm1001.2014.3001.5501 二、PgVector的使用 1、创建表与插入数据​ ​​定义向量字段​​&#xff1a; CREATE TABLE items (id SERIAL PRIMARY …