[linux内存管理] 第018篇 buddy系统的简介以及初始化 2025-01-06 评论
[linux内存管理] 第018篇 buddy系统的简介以及初始化

本文深入剖析了Linux内存管理中伙伴系统的初始化流程。伙伴系统是Linux内核用于管理和分配物理内存页面的核心算法,它将内存分成大小为2的幂次方的内存块,并通过“伙伴”机制进行分配和回收。文章详细介绍了伙伴系统的数据结构,包括`struct free_area`和`struct zone`,以及迁移类型`migratetype`和区域请求标志`__GFP区域请求标志`。此外,文章还分析了fallbacks机制和`pageblock_order`的定义。最后,文章通过分析`mm_init`函数和`memblock_free_all`函数,揭示了伙伴系统初始化的详细过程,包括释放未使用的内存、重置zone的`managed_pages`、将内存块添加到伙伴系统等操作。

[linux内存管理] 第017篇 zonelist的初始化 2025-01-06 评论
[linux内存管理] 第017篇 zonelist的初始化

本文主要分析了Linux内核中zonelist的初始化过程。首先介绍了两个关键数据结构:`pglist_data`和`zonelist`,其中`pglist_data`包含了一个`node_zonelists`数组,用于管理内存节点的zone信息;`zonelist`结构体则包含了一个`zoneref`数组,用于描述一个node的各个zone的信息。接着详细阐述了zonelist的初始化过程,包括`build_all_zonelists`、`build_zonelists`和`build_zonerefs_node`三个关键函数。最后,总结了zonelist的初始化过程,并附上了初始化过程的示意图。

[linux内存管理] 第016篇 /proc/iomem的详细解析 2025-01-06 评论
[linux内存管理] 第016篇 /proc/iomem的详细解析

本文详细介绍了Linux内核中`/proc/iomem`节点的构建与显示过程。文章首先指出`/proc/iomem`展示的是物理内存的使用情况,并通过`request_standard_resources`函数将内存区域挂载到资源树。文章进一步解析了`/proc/iomem`的注册过程,包括`ioresources_init`函数和`iomem_resource`资源树,以及数据来源和显示逻辑。最后总结,`/proc/iomem`通过遍历资源树和格式化输出,提供了系统物理内存布局的详细视图,对资源管理和调试具有重要作用。

[linux内存管理] 第015篇 理解Linux内核中的memblock和ioremap机制 2025-01-06 评论
[linux内存管理] 第015篇 理解Linux内核中的memblock和ioremap机制

Linux内核中,设备寄存器的物理地址管理涉及`memblock`和`ioremap`两个关键机制。`memblock`在内核启动阶段负责物理内存的分布记录和地址保留,确保设备寄存器不被误用。`ioremap`则将物理地址映射到内核虚拟地址空间,便于驱动程序访问寄存器。设备寄存器映射流程包括设备描述、物理地址保留、驱动加载和地址映射,最终驱动通过虚拟地址访问寄存器。这两者共同确保了设备寄存器的正确管理和高效访问。

[linux内存管理] 第014篇 /proc/zoneinfo的详细解析 2024-12-30 评论
[linux内存管理] 第014篇 /proc/zoneinfo的详细解析

深入剖析了Linux内核内存管理中/proc/zoneinfo虚拟文件的实现原理及信息结构,聚焦zoneinfo_show与zoneinfo_show_print两个核心函数,详细解析其如何遍历各个内存节点和zone,并输出包括节点内存统计、zone页面分布、水位线、页面状态等关键数据。文章针对每项输出参数进行了明晰解释,帮助理解匿名页面、文件缓存、slab等在内存管理中的角色及其状态变化。通过精细揭示/proc/zoneinfo信息来源、内容组织和内核统计逻辑,为开发者和运维人员提供了获取和解读Linux物理内存实时状态的系统级参考,对性能优化及故障排查具有实用价值。

[linux内存管理] 第013篇 zone的初始化 2024-12-21 评论
[linux内存管理] 第013篇 zone的初始化

深入剖析Linux内核在物理内存初始化阶段对zone区域的配置过程,围绕zone_sizes_init和free_area_init两个关键函数,系统展示内存分区边界的确立与结构初始化流程。通过追踪start_kernel的调用链,详细讲解zone_sizes_init如何依据DRAM最小与最大页帧号、系统体系结构特性动态计算ZONE_DMA、ZONE_DMA32、ZONE_NORMAL等区域的PFN界限,并最终通过free_area_init设置各zone边界,同时针对NUMA架构完成节点内存的分区与struct page的初始化。

[linux内存管理] 第012章 物理内存管理三大结构体之zone 2024-12-12 评论
[linux内存管理] 第012章 物理内存管理三大结构体之zone

本文探讨了Linux内存管理中的内存域(Zone)概念。内存域是内核内存管理机制的重要组成部分,它根据内存区域的特点对物理内存进行划分,以满足不同类型的内存分配需求。本文详细介绍了Zone的类型、数据结构以及其在内存管理中的作用,并解释了Zone的统计信息、冷热页与Per-CPU上的页面高速缓存等相关概念。最后,通过关系结构图和架构层次图,直观展示了Zone与其他内存管理结构之间的关系。

[linux 内存管理] 第010篇 paging_init详解 2024-12-03 评论
[linux 内存管理] 第010篇 paging_init详解

深入解析Linux内核启动过程中内存管理的关键环节——paging_init的实现与流程。从内核镜像与DTB映射完成、物理内存信息收集,到最终通过paging_init建立全局页表,实现物理内存与虚拟地址的完整线性映射。不仅详细拆解了pgd_set_fixmap与map_kernel等核心函数如何操作页表,确保各段内存安全可访问,还揭示了FIXMAP临时映射区的机制及内核空间各段映射权限的处理逻辑。整个过程展现内存状态由“黑暗”到“可控”转变,让内核具备正式使用和管理所有物理内存的能力。通过示意图与源码分析,读者能够系统理解内存初始化背后的技术细节与实际意义,为深入掌握Linux内存管理体系奠定基础。