![[linux内存管理] 第009篇 reserved-memory详解](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/11/cover_linux_memory_management_009.png) 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    [linux内存管理] 第009篇 reserved-memory详解
随着内核运行,物理内存碎片化问题会影响设备使用。为此,内核提供 reserved memory 机制,为特定设备预留内存,提高内存利用率。本文分析了 reserved memory 的配置和解析过程,包括 DTS 中的属性、静态/动态预留、no-map 和 reusable 等概念。内核解析 reserved memory 节点时,会根据属性值确定内存的 base 和 size,并进行相应的初始化操作。CMA 是一种特殊的 reserved memory,需要编写驱动程序进行初始化。
![[linux内存管理] 第008篇 memblock子系统详解](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/11/cover_linux_memory_management_008.png) 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    [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映射详解](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/11/cover_linux_memory_management_007.png) 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    [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全局简述](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/11/cover_linux_memory_management_006.png) 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    linux内存管理] 第006篇 start_kernel全局简述
本文简要介绍了Linux内核启动过程中`start_kernel`函数的内存管理代码流程。文章首先概述了`start_kernel`的功能,然后详细解析了其中的`setup_arch`函数及其关键步骤,包括内存映射、设备树解析、页表建立等。接着,文章总结了`bootmem_init`函数的初始化流程,涉及物理内存的页帧号确定、sparse内存模型的初始化以及内存区域的标记等。整体而言,文章提供了Linux内存管理初始化过程的清晰概述。
![[linux内存管理] 第004章 内存架构和内存模型](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/11/cover_linux_memory_management_004.png) 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    [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内存管理] 第003篇 内存分布](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/11/cover_linux_memory_management_003.png) 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    [linux内存管理] 第003篇 内存分布
本文详细阐述了进程在编译时和运行时,其内存的分布情况,并简单介绍了在arm64 系统中虚拟地址的分布情况。文章首先介绍了内存的概念和存储方式,随后解释了虚拟内存的由来和作用,最后从进程和Linux内核的角度分别探讨了内存的管理机制。
![[linux内存管理] 第005篇 启动代码分析之汇编部分](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/11/banner_kernel.png) 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    [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语言部分。
如何下载以及编译ACK?
本文介绍了如何下载Android通用内核代码(ACK),并对其进行编译,包括使用Bazel和旧版build.sh脚本的方法。文章还详细说明了如何修改KMI接口,包括修改特定文件、更新ABI以及向Google提交代码更改的步骤。整个流程涉及命令行操作、文件编辑和版本控制,旨在帮助开发者定制和更新Android内核。
![[linux内存管理] 第001篇 内存与内存管理机制](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/11/cover_linux_memory_management_001.png) 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    [linux内存管理] 第001篇 内存与内存管理机制
**内存管理**是操作系统核心功能之一,经历了从纸带存储到现代内存管理机制的演变。内存,作为数据货架,以字节为单位存储数据,并通过内存地址进行编号。内存类型包括RAM、ROM、闪存和虚拟内存等。RAM分为SRAM和DRAM,SRAM速度快但成本高,DRAM容量大且成本低。内存分段机制将程序内存空间划分为多个逻辑分段,解决了地址空间保护问题,但内存使用效率低。内存分页机制将内存划分为固定大小的页面,提高了内存使用效率。MMU负责将虚拟页面映射到物理页面,实现内存管理机制。
![[linux内存管理] 第002篇 页表查询过程简述](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/11/cover_linux_memory_management_002.png) 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    [linux内存管理] 第002篇 页表查询过程简述
您好,我已根据您提供的文档内容,完成了对内存管理单元(MMU)、页表(PT)、页表项(PTE)、转换后备缓冲器(TLB)等概念的总结,并对ARMv8处理器中的分页管理原理进行了阐述。同时,我还对Linux内核中关于页表操作的API进行了简要分析,包括PGD、PUD、PMD的划分,以及页表设置相关的宏定义。如果您需要更详细的源码分析或有其他问题,请随时告诉我。
 
    