#Linux内存管理# 在系统启动时,ARM Linux内核如何知道系统中有多大的内存空间?

在ARM Linux系统启动过程中,内核通过多级机制协同探测物理内存空间大小,具体实现逻辑如下:

一、Bootloader固件传递内存参数

1.设备树(DTB)机制

ARM架构使用设备树作为硬件描述的标准方式。Bootloader(如U-Boot)会在加载内核前,将内存信息写入设备树文件(.dtb),具体通过memory节点定义:

memory@80000000 {

device_type = "memory";

reg = <0x80000000 0x40000000>; // 起始地址0x80000000,容量1GB

};

内核启动时通过early_init_dt_scan_memory()解析该节点reg属性中的地址范围,将内存信息注册到memblock分配器。

2.传统ATAGs传递(旧架构)

对于未采用设备树的旧系统,Bootloader通过ATAG(ARM Tagged List)中的ATAG_MEM标签传递内存参数,内核通过parse_tags()解析。

二、固件接口交互

1.UEFI/ACPI机制(ARMv8+)

在支持UEFI的ARM64系统(如服务器芯片)中,内核通过efi_get_memory_map()获取UEFI提供的内存映射表,包含所有物理内存区域及其属性(可用/保留)。

2.低层探测(x86移植机制)

内核启动早期调用detect_memory(),通过固件中断(如ARM的SMCCC接口)获取内存布局,生成e820内存映射表。

三、内核内存管理初始化

1.memblock分配器阶段

启动初期通过memblock_add()将探测到的物理内存加入管理,过滤保留区域(如内核镜像、设备树占用的内存)。

关键函数:memblock_start_of_DRAM()和memblock_end_of_DRAM()确定实际可用内存边界(参考ARM64内存布局)。

在setup_arch()函数中,内核调用arm_memblock_init()解析设备树中的内存信息,并将有效内存区域加入memblock内存分配器。关键代码路径:

start_kernel()

-> setup_arch()

-> arm_memblock_init()

-> early_init_dt_scan_memory() // 解析设备树中的memory节点

2.页表构建与内存映射

在head.S中执行__create_page_tables,为线性映射区(如ARM64的0x80000000~0xFFFFFFFF)建立1:1物理映射(Section级或Page级),确保内核可直接访问物理内存(见内核页表建立)。

四、运行时验证与调整

1.内存热插拔探测

对于支持动态内存扩展的系统,内核通过acpi_memory_device_add()检测新增内存条,更新memblock信息。

2.NUMA拓扑感知

多核服务器中,内核解析SRAT(System Resource Affinity Table)确定不同NUMA节点的内存分布,优化访问延迟。

五、用户态验证方法

1.内核日志查看

dmesg | grep -i "memory" # 显示探测到的内存区域,如:

0.000000 Memory: 1024MB/2048MB available

2.系统文件查询

cat /proc/iomem # 显示详细物理内存分区

cat /proc/meminfo # 查看MemTotal等统计信息

内存探测流程总结,关键代码路径:

setup_arch() → setup_machine_fdt():初始化设备树。

early_init_dt_scan_nodes() → early_init_dt_scan_memory():扫描内存节点。

arm_memblock_init():将内存区域注册到memblock。

ABootloader阶段 --> B{传递内存参数}

B -->|设备树DTB| C内核解析memory节点

B -->|ATAGs| Dparse_tags解析

C --> Ememblock初始化

D --> E

E --> F建立线性映射页表

F --> G伙伴系统接管内存

G --> H用户态工具验证

相关推荐
Vcaker29 分钟前
Linux学习36-k8s集群升级及kube-vip高可用
linux·运维·学习
skywalk81631 小时前
Deepseek harness的4种模式 配置文件内容
linux·人工智能·ubuntu·deepseek·harness
沫璃染墨1 小时前
《从零入门Linux系统篇(五十一):线程篇·四——pthread线程库详解:从线程创建到终止与分离》
linux·运维·服务器·开发语言·c++·系统架构·线程
YYRAN_ZZU1 小时前
GMSL开发加解串配置介绍
linux·嵌入式硬件
云计算练习生2 小时前
什么是上下文切换?进程切换时 CPU 到底在保存什么
linux·服务器·操作系统·进程切换
用户0510122572962 小时前
RGA(二)——RK3588 的核拓扑与能力差异
linux·嵌入式
用户0510122572962 小时前
RGA(一)——基础知识
linux·嵌入式
qetfw2 小时前
Debian 综合服务实训:Apache2、Samba、LDAP、vsftpd 与 OpenVPN
linux·服务器·debian
用户0510122572962 小时前
RGA(三)——实宽高、虚宽高与对齐约束
linux·嵌入式
fastjson_2 小时前
帆软看板 - 问题收集
linux·前端·javascript