Linux内存管理
文章平均质量分 91
Linux底层内存管理、分配器、内存回收、用户态内存分配等内容的学习笔记。
落尘纷扰
服务于制造业的码农,没怎么写过代码
展开
-
Linux内核中的page migration和compaction机制简介
我们知道buddy容易产生内存碎片,内核中可以通过给页面设置迁移类型以及compaction机制来预防和处理内存碎片。内存页主要有下面三种类型: 1.可移动的(movable)。用户态申请。 2.可回收的(reclaimable)。文件系统的cache。 3.不可移动(unmovable)。内核申请用。可移动的页面,顾名思义就是在被分配之后,还可以改变在物理内存中的位置。只要更新一下...原创 2018-04-06 18:31:55 · 5012 阅读 · 0 评论 -
Linux内存管理(1) - bootmem分配器
内核中分配内存基本都基于伙伴系统,但是在内核启动之初,伙伴系统尚未建立,这时需要一个临时的内存分配器负责提供内核早期的内存需求,例如存放内核的代码段和数据段,以及将内存进行简单的管理供后续伙伴系统使用,这就是bootmem分配器。本文基于Linux 2.6.31的内核源码对bootmem分配器的工作过程进行分析。原创 2015-03-01 23:20:42 · 1998 阅读 · 0 评论 -
Linux内存管理(2) - buddy系统
本文目的在于分析Linux内存管理机制中的伙伴系统。内核版本为2.6.31。1. 伙伴系统的概念在系统运行过程中,经常需要分配一组连续的页,而频繁的申请和释放内存页会导致内存中散布着许多不连续的页,这样,当某一时刻要申请一块较大的连续内存时,虽然系统内存余量足够,即很多页是空闲的,但找不到一大块连续的内存供使用。Linux内核中使用伙伴系统(buddy system)算法来管理内存页。它把所有的空...原创 2015-03-02 20:54:17 · 6083 阅读 · 0 评论 -
Linux内存管理(3) - slab分配器和kmalloc
本文目的在于分析Linux内存管理机制的slab分配器。内核版本为2.6.31。1. SLAB分配器内核需要经常分配内存,我们在内核中最常用的分配内存的方式就是kmalloc了。前面讲过的伙伴系统只支持按页分配内存,但这个单位太大了,有时候我们并不需要这么大的内存,比如我想申请128字节的空间,如果直接使用伙伴系统则需分配4KB的一整页,这显然是浪费。slab分配器将页拆分为更小原创 2015-03-02 21:04:46 · 4985 阅读 · 0 评论 -
Linux内存管理(4) - 不连续页的分配vmalloc
本文目的在于分析Linux内核中的vmalloc函数。内核版本为2.6.31。我们知道物理上连续的映射对内核是最好的,但不是总能成功。在分配一大块内存时,可能无法找到连续的内存块。在用户空间这不是问题,因为普通进程设计为使用处理器的分页机制,当然这会降低速度并占用TLB。在内核中也可以使用同样的技术,典型的例子为vmalloc()。vmalloc是一个接口函数,内核代码用它来分配在虚拟原创 2015-03-02 21:22:31 · 3021 阅读 · 2 评论 -
Linux内存管理 —— 为buddy做准备:MMU, TLB, ZONE
本文都是假设系统是32位,页大小为4KB,基于ARM架构(不过和体系结构相关的内容不多)。1. 了解MMU在启用MMU的Linux内核中,CPU是通过虚拟地址来访问物理内存的。MMU(Memory Management Unit),即内存管理单元,它集成在CPU中,负责虚拟地址到物理地址的映射,以及物理地址的访问,并提供内存访问权限检查机制,以达到内存保护的作用(ARM里面的MPU(M...原创 2018-03-06 17:12:32 · 2278 阅读 · 1 评论 -
Linux内存管理 —— 内核态和用户态的内存分配方式
1. 使用buddy系统管理ZONE我的这两篇文章buddy系统和slab分配器已经分析过buddy和slab的原理和源码,因此一些细节不再赘述。所有zone都是通过buddy系统管理的,buddy system由Harry Markowitz在1963年提出。buddy的工作方式我就不说了,简单来说buddy就是用来管理内存的使用情况:一个页被申请了,别人就不能申请了。通过/proc/b...原创 2018-03-06 17:36:04 · 14986 阅读 · 0 评论 -
Linux内存管理 —— 进程的虚拟地址空间和VSS
1. 进程虚拟地址空间进程的虚拟地址空间记录在其task_struct结构的指针成员mm中(struct mm_struct),这是用户态进程才有的,里面包含pgd、代码段、堆、栈地址等信息。(kernel不需要mm,因为kernel不需要引用动态库,内核线程有自己的栈空间,虚拟地址映射关系也是全局可见的,注意vmalloc和kmap产生的映射是由内核中的全局变量swapper_pg_dir和...原创 2018-03-06 17:47:07 · 1518 阅读 · 0 评论 -
Linux内存管理 —— 文件系统缓存和匿名页的交换
1. swap的含义在Linux里swap有两个意思: 1. 动词:交换。内存和磁盘的颠簸行为。 2. 名词:硬盘的swap分区。没有文件背景的页面,即匿名页(anonymous page),如堆,栈,数据段等,不是以文件形式存在,因此无法和磁盘文件交换,但可以通过硬盘上划分额外的swap交换分区或使用交换文件进行交换。即上面wap作为名词的意思。Swap分区可以将不活跃的页交换到硬盘...原创 2018-03-06 18:27:22 · 17070 阅读 · 3 评论 -
Linux内存管理 —— DMA和一致性缓存
1. 出现内存不一致的原因CPU写内存的时候有两种方式: 1. write through: CPU直接写内存,不经过cache。 2. write back: CPU只写到cache中。cache的硬件使用LRU算法将cache里面的内容替换到内存。通常是这种方式。DMA可以完成从内存到外设直接进行数据搬移。但DMA不能访问CPU的cache,CPU在读内存的时候,如果cache命中...原创 2018-03-06 18:34:30 · 27697 阅读 · 6 评论