![[linux内存管理] 第016篇 /proc/iomem的详细解析](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/25/1/cover_linux_memory_management_016.png)
[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机制](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/25/1/cover_linux_memory_management_015.png)
[linux内存管理] 第015篇 理解Linux内核中的memblock和ioremap机制
Linux内核中,设备寄存器的物理地址管理涉及`memblock`和`ioremap`两个关键机制。`memblock`在内核启动阶段负责物理内存的分布记录和地址保留,确保设备寄存器不被误用。`ioremap`则将物理地址映射到内核虚拟地址空间,便于驱动程序访问寄存器。设备寄存器映射流程包括设备描述、物理地址保留、驱动加载和地址映射,最终驱动通过虚拟地址访问寄存器。这两者共同确保了设备寄存器的正确管理和高效访问。
![[linux内存管理] 第008篇 memblock子系统详解](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/11/cover_linux_memory_management_008.png)
[linux内存管理] 第008篇 memblock子系统详解
本文详细介绍了Linux内核启动阶段的物理内存管理机制,主要围绕memblock子系统展开,包括其数据结构、初始化过程和内存的添加与移除操作。 **memblock子系统** 是Linux内核启动阶段用于管理物理内存的机制,它在buddy系统初始化之前管理内存,直到free_initmem()函数被调用。memblock管理的是物理地址,而非虚拟地址,其核心数据结构包括: * **struct memblock**: 用于描述memblock子系统的全局变量,包含内存块大小限制、可管理内存区域、预留已分配空间等信息。 * **struct memblock_type**: 用于描述memblock子系统中不同类型的内存区域,例如动态内存(memory)和静态内存(reserved)。 * **struct memblock_region**: 代表一块物理内存区域,包含起始地址、大小和标记等信息。 * **enum memblock_flags**: 用于描述内存区域的属性,例如hotplug、mirror和nomap等。 **memblock初始化过程** 主要涉及以下步骤: 1. **确定线性映射区域**: 计算虚拟地址可以覆盖的线性区域大小,并根据配置移除物理地址以外的内存。 2. **确定memstart_addr**: 确定物理内存的起始地址,并将其向下对齐到ARM64_MEMSTART_ALIGN。 3. **移除线性映射以外的内存**: 移除虚拟地址无法覆盖的内存区域。 4. **确定memory_limit区域**: 如果设置了memory_limit,则根据其值重新配置内存区域。 5. **确定initrd内存**: 如果存在initrd,则将其添加到memblock.memory中,并设置为reserved类型。 6. **将内核镜像所在内存reserved**: 将内核镜像所在的物理内存设置为reserved类型,并在paging_init()结束后释放。 7. **解析dtb中reserved-memory节点**: 将dtb中描述的预留内存区域添加到memblock.memory中,并根据其属性进行处理。 **内存的添加与移除** 主要通过memblock_add_range和memblock_remove_range函数实现,它们会根据内存区域的大小、位置和属性进行相应的处理,例如分割、合并和标记等。 **总结**: memblock子系统在Linux内核启动阶段扮演着重要的角色,它有效地管理了物理内存,并为后续的内存分配和回收提供了基础。通过理解memblock子系统的原理和操作,可以更好地理解Linux内核的内存管理机制。 **此外,本文还介绍了如何通过/proc/iomem和/sys/kernel/debug/memblock节点查看内存布局,以及arm64_memblock_init函数的具体实现过程**。
![linux内存管理] 第006篇 start_kernel全局简述](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/11/cover_linux_memory_management_006.png)
linux内存管理] 第006篇 start_kernel全局简述
本文简要介绍了Linux内核启动过程中`start_kernel`函数的内存管理代码流程。文章首先概述了`start_kernel`的功能,然后详细解析了其中的`setup_arch`函数及其关键步骤,包括内存映射、设备树解析、页表建立等。接着,文章总结了`bootmem_init`函数的初始化流程,涉及物理内存的页帧号确定、sparse内存模型的初始化以及内存区域的标记等。整体而言,文章提供了Linux内存管理初始化过程的清晰概述。