当前位置: 首页 > news >正文

#Linux内存管理# 在ARM32bit Linux中,高端内存的起始地址是如计算出来的?

在32位Linux系统中,高端内存(High Memory)的起始地址是由内核虚拟地址空间和物理内存容量共同决定的。以下是其计算逻辑和关键步骤:

1. 32位虚拟地址空间划分

32位系统的虚拟地址空间为 4GB(0x00000000 ~ 0xFFFFFFFF),通常划分为:

 

用户空间:前 3GB(0x00000000 ~ 0xBFFFFFFF),供应用程序使用。

 

内核空间:后 1GB(0xC0000000 ~ 0xFFFFFFFF),供内核使用。

 

内核需要通过这 1GB 的虚拟地址空间 访问所有物理内存。当物理内存超过 1GB 时,内核无法直接为所有物理页分配固定的虚拟地址,此时需要引入 高端内存 机制。

 

2. 低端内存(Low Memory)与高端内存(High Memory)

 

低端内存:

内核通过 直接映射(Direct Mapping) 将一部分物理内存固定映射到内核虚拟地址空间。

虚拟地址范围:0xC0000000 ~ (0xC0000000 + lowmem_size)。

物理地址范围:0x00000000 ~ lowmem_size(直接线性映射)。

最大低端内存:通常为 896MB(由内核参数 lowmem_end_pfn 决定)。

 

高端内存:

超出低端内存的物理内存部分(即 lowmem_size ~ 物理内存上限)无法直接映射到内核虚拟地址空间,必须通过动态映射(如 kmap、vmalloc)访问。

 

3. 高端内存起始地址的计算

 

高端内存的起始地址是物理内存中超出低端内存部分的第一个物理地址,计算公式如下:

high_memory_start=lowmem_size

 

其中,lowmem_size 的计算逻辑为:

lowmem_size=lowmem_end_pfn×PAGE_SIZE

 

lowmem_end_pfn:由内核根据物理内存容量和地址空间限制动态确定。

 

PAGE_SIZE:通常为 4KB。

 

4. 内核源码中的实现

 

在 Linux 内核中,相关定义位于 arch/x86/include/asm/pgtable_32_types.h:

#define __PAGE_OFFSET _AC(0xC0000000, UL) // 内核空间起始地址

#define MAXMEM _AC(896MB, UL) // 低端内存最大为 896MB

#define high_memory (void *)((0xC0000000UL) + (MAXMEM)) 

 

MAXMEM:低端内存的虚拟地址上限(0xC0000000 + 896MB = 0xF0000000)。

 

high_memory:高端内存的起始虚拟地址(实际对应物理地址 896MB)。

 

5. 案例分析:物理内存为 2GB 的系统

 

低端内存:直接映射 896MB(虚拟地址 0xC0000000 ~ 0xF0000000)。

 

高端内存:物理地址从 896MB 到 2GB 的部分(共 1152MB)。

 

访问高端内存:

内核需通过 kmap() 将高端内存的物理页临时映射到内核虚拟地址空间。

映射的虚拟地址位于 0xF0000000 ~ 0xFFFFFFFF(即剩余的 256MB 内核空间)。

 

6. 关键验证方法

查看 /proc/meminfo 或内核日志:

$ dmesg | grep "Memory"

[ 0.000000] Memory: 2048MB/2048MB (lowmem: 896MB, highmem: 1152MB)

 

总结

低端内存:内核直接映射的物理内存(≤896MB),虚拟地址与物理地址线性对应。

 

高端内存:超出低端内存的物理内存部分,必须通过动态映射访问。

 

起始地址:高端内存的物理起始地址为 lowmem_size(通常为896MB),由内核虚拟地址空间大小和物理内存容量共同决定。

 

http://www.dtcms.com/a/112068.html

相关文章:

  • 思二勋:未来所有的业务都将生于AI、长于AI、成于AI
  • 搜索二维矩阵
  • 笔记:代码随想录算法训练营day65:dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
  • Docker安装、配置Redis
  • 使用Expo框架开发APP——详细教程
  • 【JavaScript】原型链 prototype 和 this 关键字的练习(老虎机)
  • 安当TDE透明加密:构建跨地域文件服务器安全传输的“双重保险“
  • VBA中类的解读及应用第二十二讲:利用类判断任意单元格的类型-5
  • C语言:3.31
  • 【YOLO系列(V5-V12)通用数据集-火灾烟雾检测数据集】
  • 大模型学习四:‌DeepSeek Janus-Pro 多模态理解和生成模型 本地部署指南(折腾版)
  • 七均线策略思路
  • Mac VM 卸载 win10 安装win7系统
  • Win7下安装高版本node.js 16.3.0 以及webpack插件的构建
  • Apache Camel指南-第四章:路由径构建之异常处理
  • 如何使用 IntelliJ IDEA 开发命令行程序(或 Swing 程序)并手动管理依赖(不使用 pom.xml)
  • 从飞机的状态矩阵A阵求运动模态的特征根、求传递函数矩阵
  • NOIP2013提高组.华容道
  • 从菜鸟到高手的提示词优化指南‌
  • Muduo网络库介绍
  • Sensodrive力控关节模组SensoJoint:TÜV安全认证助力机器人开发
  • 主机和虚拟机间的网络通信
  • LeetCode算法题(Go语言实现)_29
  • JavaScript重难点突破:事件循环
  • 基于 Python 的自然语言处理系列(70):检索增强生成(RAG)
  • Go语言-初学者日记(八):构建、部署与 Docker 化
  • 《操作系统真象还原》第五章(2)——启用内存分页机制
  • 蓝桥杯15届 宝石组合
  • 【HC-05蓝牙模块】基础AT指令测试
  • 思维链 Chain-of-Thought(COT)