[linux内存管理] 第009篇 reserved-memory详解 9月前查看 评论
[linux内存管理] 第009篇 reserved-memory详解

随着内核运行,物理内存碎片化问题会影响设备使用。为此,内核提供 reserved memory 机制,为特定设备预留内存,提高内存利用率。本文分析了 reserved memory 的配置和解析过程,包括 DTS 中的属性、静态/动态预留、no-map 和 reusable 等概念。内核解析 reserved memory 节点时,会根据属性值确定内存的 base 和 size,并进行相应的初始化操作。CMA 是一种特殊的 reserved memory,需要编写驱动程序进行初始化。

[linux内存管理] 第008篇 memblock子系统详解 9月前查看 评论
[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内存管理] 第007篇 fixmap映射详解 9月前查看 评论
[linux内存管理] 第007篇 fixmap映射详解

您好,以下是对您提供的文章内容的100字左右摘要总结: 文章主要介绍了Linux内核中fixmap的概念、作用和实现。fixmap是内核预留的一段虚拟内存空间,用于早期固定映射,包括fdt、console、外设动态映射和paging_init()等。文章详细分析了fixmap的分布、初始化过程以及与设备树(dtb)的关系。fixmap的初始化涉及pgd、pud、pte等页表的创建和映射,而设备树dtb的映射则通过fixmap_remap_fdt()函数实现。此外,文章还介绍了early_ioremap_init()和setup_machine_fdt()等函数的作用,以及FDT调试方法。

linux内存管理] 第006篇 start_kernel全局简述 9月前查看 评论
linux内存管理] 第006篇 start_kernel全局简述

本文简要介绍了Linux内核启动过程中`start_kernel`函数的内存管理代码流程。文章首先概述了`start_kernel`的功能,然后详细解析了其中的`setup_arch`函数及其关键步骤,包括内存映射、设备树解析、页表建立等。接着,文章总结了`bootmem_init`函数的初始化流程,涉及物理内存的页帧号确定、sparse内存模型的初始化以及内存区域的标记等。整体而言,文章提供了Linux内存管理初始化过程的清晰概述。

[linux内存管理] 第004章 内存架构和内存模型 9月前查看 评论
[linux内存管理] 第004章 内存架构和内存模型

您好!根据您提供的文档内容,我为您总结出以下要点: **架构概述**: * 服务器架构主要分为三类:SMP、NUMA、MPP。 * 共享存储型多处理机有UMA和NUMA两种模型。 **基本概念**: * PFN:物理内存页帧编号,用于标识每个物理页。 * PF:线性地址被分成固定长度的页,例如4K。 * Page Frame:内存被分成固定长度的存储区域,包含一个页。 * UMA:所有CPU访问内存的时间相同,共享同一块物理内存。 * NUMA:CPU访问本地内存速度快于远端内存,有多个内存节点和CPU簇。 * COMA:NUMA的一种特例,只用高速缓存访问架构。 **内存架构总结**: | 概念 | 描述 | 特点 | |---|---|---| | SMP | 共享存储型多处理机 | 可伸缩性有限 | | UMA | 均匀存储器存取 | 所有处理器对所有存储字具有相同的存取时间 | | NUMA | 非均匀存储器存取 | 访问时间随存储字的位置不同而变化 | | COMA | 只用高速缓存的存储器结构 | 每个处理机结点上没有存储器层次结构 | **内存模型**: * FLATMEM:适用于具有连续或大部分连续物理内存的非NUMA系统,使用全局数组mem_map组织物理页。 * DISCONTIGMEM:适用于管理多块非连续的物理内存,通过node节点管理连续物理内存页,避免内存空洞造成的空间浪费。 * SPARSEMEM:适用于内存热拔插场景,使用section对粒度更小的连续内存块进行精细管理。 **内存模型转换逻辑**: * FLATMEM:基于mem_map数组进行偏移操作。 * DISCONTIGMEM:先定位page所在node,再通过node_mem_map定位PFN。 * SPARSEMEM:先定位page或PFN所在section,再通过section_mem_map定位page或PFN。 **总结**: 文档详细介绍了计算机系统中以内存为研究对象的两种架构:NUMA和UMA,以及对应的内存模型:FLATMEM、DISCONTIGMEM、SPARSEMEM。并对内存管理发展过程中,与UMA和NUMA对应的三种内存模型进行了简述。 希望以上总结对您有所帮助!如有任何疑问,请随时提出。

[linux内存管理] 第005篇 启动代码分析之汇编部分 9月前查看 评论
[linux内存管理] 第005篇 启动代码分析之汇编部分

本文详细分析了Linux内核启动阶段的引导程序、内核起始地址、head.S、内存映射和__cpu_setup函数。引导程序负责初始化物理内存、设置设备树、解压缩内核映像并将其加载到内核运行地址,然后跳转到内核入口地址。内核起始地址在arch/arm64/kernel/vmlinux.lds.S文件中定义,并使用readelf工具读取vmlinux文件进行验证。head.S文件包含内核启动汇编代码,主要完成切换到EL1模式、创建恒等映射页表、为打开MMU做处理器相关初始化、启动MMU并跳转到start_kernel()函数等任务。内存映射部分分析了恒等映射和粗粒度内核镜像映射的原理和实现,以及map_memory宏、compute_indices宏和populate_entries宏的作用。__cpu_setup函数负责为打开MMU做一些处理器相关初始化,包括清除本地TLB、启用FP/ASIMD、设置TCR寄存器、设置SCTLR_EL1寄存器等。__primary_switch函数启动MMU,并跳转到start_kernel()函数进入内核的C语言部分。

9月前查看 1 条
如何下载以及编译ACK?

本文介绍了如何下载Android通用内核代码(ACK),并对其进行编译,包括使用Bazel和旧版build.sh脚本的方法。文章还详细说明了如何修改KMI接口,包括修改特定文件、更新ABI以及向Google提交代码更改的步骤。整个流程涉及命令行操作、文件编辑和版本控制,旨在帮助开发者定制和更新Android内核。

[linux内存管理] 第001篇 内存与内存管理机制 9月前查看 评论
[linux内存管理] 第001篇 内存与内存管理机制

前言 在操作系统还没有出现之前,程序存放在纸带上,计算机读取一张纸带就运行一条指令,这种从外部存储介质上直接运行指令的方法效率很低。 后来出现了内存存储器,也就是说,程序要运行,首先要加载,然后执行,这就是所谓的 “存储的程序”。这一概念开启了操作系统快速发展的通道,直至后来出现了分页机制。 在这个

[linux内存管理] 第000篇 Linux内存管理系列开篇 9月前查看 评论
[linux内存管理] 第000篇 Linux内存管理系列开篇

本文为Linux内存管理系列文章的摘要总结。文章首先介绍了源码遵循的约定,包括芯片架构、内存架构、内核版本等信息。接着概述了内存管理的一些预备知识,包括内存与内存管理机制、页表查询过程、内存分布等。文章详细分析了物理内存初始化流程,包括启动代码分析、start_kernel全局简述、fixmap映射、memblock子系统等。此外,文章还介绍了各种内存分配器(如buddy分配器、percpu分配器、CMA分配器等)和内存管理相关概念(如缺页异常处理、memcg、PSI等)。最后,列出了文章中涉及的专业术语及其解释。

基于hexo+vercel零成本搭建博客网站 9月前查看 评论
基于hexo+vercel零成本搭建博客网站

搭建个人博客网站是数字时代展示个人才华和分享知识的重要方式。本文介绍了选择Hexo框架和Vercel平台零成本搭建博客的原因及具体步骤。首先阐述了拥有博客网站的意义,然后详细说明了安装Hexo和部署到GitHub的流程,最后讲解了如何利用Vercel进行网站上线。文章简洁明了,为初学者提供了清晰的建站指导。