2024-11-26
[linux内存管理] 第004章 内存架构和内存模型
文档详细介绍了计算机系统中以内存为研究对象的两种架构:NUMA和UMA,以及对应的内存模型:FLATMEM、DISCONTIGMEM、SPARSEMEM。并对内存管理发展过程中,与UMA和NUMA对应的三种内存模型进行了简述。
2024-11-26
[linux内存管理] 第003篇 内存分布
本文详细阐述了进程在编译时和运行时,其内存的分布情况,并简单介绍了在arm64 系统中虚拟地址的分布情况。文章首先介绍了内存的概念和存储方式,随后解释了虚拟内存的由来和作用,最后从进程和Linux内核的角度分别探讨了内存的管理机制。
2024-11-26
[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语言部分。
2024-11-25
[linux内存管理] 第001篇 内存与内存管理机制
内存管理是操作系统核心功能之一,经历了从纸带存储到现代内存管理机制的演变。内存,作为数据货架,以字节为单位存储数据,并通过内存地址进行编号。内存类型包括RAM、ROM、闪存和虚拟内存等。RAM分为SRAM和DRAM,SRAM速度快但成本高,DRAM容量大且成本低。内存分段机制将程序内存空间划分为多个逻辑分段,解决了地址空间保护问题,但内存使用效率低。内存分页机制将内存划分为固定大小的页面,提高了内存使用效率。MMU负责将虚拟页面映射到物理页面,实现内存管理机制。
2024-11-25
[linux内存管理] 第002篇 页表查询过程简述
对内存管理单元(MMU)、页表(PT)、页表项(PTE)、转换后备缓冲器(TLB)等概念的总结,并对ARMv8处理器中的分页管理原理进行了阐述。同时,我还对Linux内核中关于页表操作的API进行了简要分析,包括PGD、PUD、PMD的划分,以及页表设置相关的宏定义。
2024-11-21
linux源码解析05–ioremap原理
本文介绍了不同处理器架构对内存访问的方式,如x86架构通过I/O端口空间访问外设,而RISC架构如ARM/PowerPC则将I/O内存空间视为普通内存的一部分。文章重点讲解了ioremap映射函数,包括其定义和使用,以及如何通过ioremap_page_range函数将物理地址映射到虚拟地址,使应用程序能够通过虚拟地址访问寄存器地址。
2024-11-20
linux源码解析07–缺页异常之架构相关部分(ARM64为例)分析
本文详细介绍了缺页异常的原理和实现过程,涵盖了从异常向量表到通用代码处理的各个环节,并对主要缺页异常类型进行了分类说明。缺页异常是操作系统虚拟内存管理的重要机制,对于进程来说时透明的。文章中还涉及了匿名映射、文件映射、swap 缺页异常、写时复制缺页异常等概念,为理解虚拟内存管理提供了基础。
2024-11-20
linux源码解析06–常用内存分配函数kmalloc、vmalloc、malloc和mmap实现原理
围绕内核中的 kmalloc、vmalloc 和用户态 malloc 三种内存分配方式,从实现路径和底层机制进行对比分析。kmalloc 基于 slab 分配器,从各类 slab 缓冲区中按 size 选择合适 cache,通过 kmem_cache_alloc_trace/slab_alloc 分配物理上连续的内存,适合小块、频繁分配的场景。 vmalloc 则在 vmalloc 区域临时申请 vm_struct,计算所需页数后为其分配 struct page* 数组,再通过 alloc_pages_node 逐页(或成组)分配物理页,最后用 vmap_pages_range 建立虚拟地址
2024-11-20
linux内核源码解析04–用户进程页表创建
科学边界发表的文章详细阐述了Linux内核中进程页表的创建、缺页异常处理以及进程切换时的内存管理机制。文章首先介绍了进程创建时页表的创建过程,包括fork时复制父进程的页表、分配pgd物理页面以及拷贝页表项。其次,描述了缺页异常导致的写时复制(COW)的处理流程,包括分配新页面、复制旧页面内容以及更新页表项。最后,文章解释了进程切换时如何通过更新ASID和页表基地址来实现地址空间的切换。这些内容对于理解Linux内存管理至关重要。