专题:Linux内存管理专题 关键词:swapper_pd_dir.ARM PGD/PTE.Linux PGD/PTE.pgd_offset_k. Linux下的页表映射分为两种,一是Linux自身的页表映射,另一种是ARM32 MMU硬件的映射. 1. ARM32页表映射 由于ARM32和Linux内核维护的页表项有所不同,所以维护了两套PTE. PGD存放在swapper_pd_dir中,一个PGD目录项其实包含了两份ARM32 PGD. 所以再分配PTE的时候,共分配了1024个PTE,5…
专题:Linux内存管理专题 关键词:分配掩码.伙伴系统.水位(watermark).空闲伙伴块合并. 我们知道Linux内存管理是以页为单位进行的,对内存的管理是通过伙伴系统进行. 从Linux内存管理框架图可知,页面分配器是其他林林总总内存操作的基础. 这也是为什么在介绍了<Linux内存管理 (1)物理内存初始化>.<Linux内存管理 (2)页表的映射过程>.<Linux内存管理 (3)内核内存的布局图>之后,紧接着就要弄明白页面分配器的原因. 1. 重要数据结…
本文目的在于分析Linux内存管理机制的slab分配器.内核版本为2.6.31.1. SLAB分配器 内核需要经常分配内存,我们在内核中最常用的分配内存的方式就是kmalloc了.前面讲过的伙伴系统只支持按页分配内存,但这个单位太大了,有时候我们并不需要这么大的内存,比如我想申请128字节的空间,如果直接使用伙伴系统则需分配4KB的一整页,这显然是浪费. slab分配器将页拆分为更小的单位来管理,来满足小于一页的内存需求.它将连续的几个页划分出更小的部分拿来分配相同类型的内存对象,对象的位置尽量…
本文目的在于分析Linux内存管理机制中的伙伴系统.内核版本为2.6.31.1. 伙伴系统的概念 在系统运行过程中,经常需要分配一组连续的页,而频繁的申请和释放内存页会导致内存中散布着许多不连续的页,这样,当某一时刻要申请一块较大的连续内存时,虽然系统内存余量足够,即很多页是空闲的,但找不到一大块连续的内存供使用. Linux内核中使用伙伴系统(buddy system)算法来管理内存页.它把所有的空闲页放到11个链表中,每个链表分别管理大小为1,2,4,8,16,32,64,128,256,5…
专题:Linux内存管理专题 关键词:RMAP.VMA.AV.AVC. 所谓反向映射是相对于从虚拟地址到物理地址的映射,反向映射是从物理页面到虚拟地址空间VMA的反向映射. RMAP能否实现的基础是通过struct anon_vma.struct anon_vma_chain和sturct vm_area_struct建立了联系,通过物理页面反向查找到VMA. 用户在使用虚拟内存过程中,PTE页表项中保留着虚拟内存页面映射到物理内存页面的记录. 一个物理页面可以同时被多个进程的虚拟地址内存映射,…
Linux的内存管理涉及到的内容非常庞杂,而且与内核的方方面面耦合在一起,想要理解透彻非常困难. 在开始学习之前进行了一些准备工作<如何展开Linux Memory Management学习?>, 1. 参考资料 遂决定以如下资料作为参考,进行Linux内存管理的研究: <奔跑吧 Linux内核>:以第2章为蓝本展开,这是目前能获取的紧跟当前内核发展(Linux 4.0),并且讲的比较全面的一本资料. <Understanding the Linux Virtual Memo…
专题:Linux内存管理专题 关键词:VMA.vm_area_struct.查找/插入/合并VMA.红黑树. 用户进程可以拥有3GB大小的空间,远大于物理内存,那么这些用户进程的虚拟地址空间是如何管理的呢? malloc()或mmap()操作都会要求在虚拟地址空间中分配内存块,但这些内存在物理上往往都是离散的. 这些进程地址空间在内核中使用struct vm_area_struct数据结构来描述,简称VMA,也被称为进程地址空间或进程线性区. 1. 数据结构 struct vm_area_str…
专题:Linux内存管理专题 关键词:数据异常.缺页中断.匿名页面.文件映射页面.写时复制页面.swap页面. malloc()和mmap()等内存分配函数,在分配时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存. 当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常. 缺页异常是Linux内存管理中最复杂和重要的一部分,需要考虑很多相关细节,包括匿名页面.KSM页面.page cache页面.写时复制.私有映射和共享映射等. 首先ARMv7-A缺页异常介绍了从数…
专题:Linux内存管理专题 关键词:struct page._count._mapcount.PG_locked/PG_referenced/PG_active/PG_dirty等. Linux的内存管理是以页展开的,struct page非常重要,同时其维护成本也非常高. 这里主要介绍struct page中_count/_mapcount和flags参数. flags是页面标志位集合,是内存管理非常重要的部分. _count表示内核中引用该页面的次数:_mapcount表示页面被进程映射的…
专题:Linux内存管理专题 关键词:RMAP.页面迁移. 相关章节:反向映射RMAP.内存规整. 页面迁移的初衷是为NUMA系统提供一种将进程迁移到任意内存节点的能力,后来内存规整和内存热插拔场景都使用了此功能. 页面迁移将就页面内容,迁移到新的页面. 需要分配新页面,将旧页面内容拷贝到新页面:然后利用RAMP技术解除旧页面的映射关系,并将映射关系映射到新页面. 1. migrate_pages系统调用 Linux提供了migrate_pages系统调用,从old_nodes中获取原内存节点,…