Tag Archives: 源码分析

【Linux内存源码分析】SLUB分配算法(2)

先由slub分配算法初始化进入分析。

回到mm_init()函数中,在调用mem_init()初始化伙伴管理算法后,紧接着调用的kmem_cache_init()便是slub分配算法的入口。其中该函数在/mm目录下有三处实现slab.cslob.cslub.c,表示不同算法下其初始化各异,分析slub分配算法则主要分析slub.c的实[……]

阅读全文

【Linux内存源码分析】SLUB分配算法(1)

前面主要分析了以页为最小单位进行内存分配的伙伴管理算法,这对于内核对内存的管理比较简单,同时较大程度上避免了内存碎片的问题。而实际上对内存的申请却不是每次都申请一个页面的,通常是不规则的,大小不一的,并且远小于一个内存页面的大小,此外更可能会频繁地申请释放这些内存。

明显每次分配小于一个页面的都统一分配一个页面的空间是过于浪费且不切实际的[……]

阅读全文

【Linux内存源码分析】内存溢出保护机制(OOM)

Linux系统内存管理中存在着一个称之为OOM killerOut-Of-Memory killer)的机制,该机制主要用于内存监控,监控进程的内存使用量,当系统的内存耗尽时,其将根据算法选择性地kill了部分进程。本文分析的内存溢出保护机制,也就是OOM killer机制了。

回到伙伴管理算法中涉及的一函数__alloc_pages_[……]

阅读全文

【Linux内存源码分析】连续内存分配器(CMA)

根据git的合入记录,CMAContiguous Memory Allocator,连续内存分配器)是在内核3.5的版本引入,由三星的工程师开发实现的,用于DMA映射框架下提升连续大块内存的申请。

其实现主要是在系统引导时获取内存,并将内存设置为MIGRATE_CMA迁移类型,然后再将内存归还给系统。内核分配内存时,在CMA管理内存中仅[……]

阅读全文

【Linux内存源码分析】页面迁移

页面迁移其实是伙伴管理算法中的一部分,鉴于其特殊性,特地另行分析。它是2007年的时候,2.6.24内核版本开发时,新增碎片减少策略(the fragmentation reduction strategy)所引入的。该策略也称之为反碎片技术(anti-gragmentation)。

根据《深入linux内核架构》的描述,反碎片的由来是因[……]

阅读全文

【Linux内存源码分析】伙伴管理算法(5)

前面已经分析了伙伴管理算法的释放实现,接着分析一下伙伴管理算法的内存申请实现。

       伙伴管理算法内存申请和释放的入口一样,其实并没有很清楚的界限表示这个函数是入口,而那个不是,所以例行从稍微偏上一点的地方作为入口分析。于是选择了alloc_pages()宏定义作为分析切入口:

[……]

阅读全文

【Linux内存源码分析】伙伴管理算法(1)

前面分析了memblock算法、内核页表的建立、内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征。而start_kernel()接下来的初始化则是linux通用的内存管理算法框架了。

build_all_zonelists()用来初始化内存分配器使用的存储节点中[……]

阅读全文

【Linux内存源码分析】构建内存管理框架(1)

传统的计算机结构中,整个物理内存都是一条线上的,CPU访问整个内存空间所需要的时间都是相同的。这种内存结构被称之为UMAUniform Memory Architecture,一致存储结构)。但是随着计算机的发展,一些新型的服务器结构中,尤其是多CPU的情况下,物理内存空间的访问就难以控制所需的时间相同了。在多CPU的环境下,系统只有一条总线,有多个[……]

阅读全文

【Linux内存源码分析】建立内核页表(1)

前面已经分析过了Intel的内存映射和linux的基本使用情况,已知head_32.S仅是建立临时页表,内核还是要建立内核页表,做到全面映射的。下面就基于RAM大于896MB,而小于4GB ,且CONFIG_HIGHMEM配置了高端内存的环境情况进行分析。

建立内核页表前奏,了解两个很关键的变量:

max_pf[……]

阅读全文

【Linux内存源码分析】系统启动阶段的memblock算法(2)

结束完memblock算法初始化前的准备工作,回到memblock算法初始化及其算法实现上面。memblock是一个很简单的算法。

memblock算法的实现是,它将所有状态都保存在一个全局变量__initdata_memblock中,算法的初始化以及内存的申请释放都是在将内存块的状态做变更。那么从数据结构入手,__init[……]

阅读全文

【Linux内存源码分析】X86内存映射小结(2)

本文主要总结一下Intelx86架构处理器所支持各式内存映射情况。

实模式

实模式下,没有什么内存映射的概念,逻辑地址简单地转换一下就是物理地址。

实模式下的逻辑地址表现形式为[BaseOffset](即[基地址:偏移量],虽然Base类似于保护模式下的段选择符,但是实模式下,它仅表示基地址,[……]

阅读全文

【Linux内存源码分析】X86内存映射小结(1)

前面分析了linux内核如何开启保护模式和启用段页映射模式,也都分析了段式映射和段页式映射的一个概况。不过前面的分析只是侧重地讲解了x86 32位环境4Kbytes页面大小的情况,但是实际上x86可支持的分页映射模式远不止于此。所以特地总结一下。

这里先基于保护模式下Intel IA-32架构处理器非PAE4[……]

阅读全文

【Linux内存源码分析】开启分页管理

前面的初探内存保护模式里面,Linux最初进入保护模式,仅仅是一种纯段式的内存映射模式,而且也未起到很明显的保护作用,明显这不是linux内存管理的最终模式。Linux是不使用段保护的,使用的是页保护,所以它还需要开启分页管理。

分页说简单也简单,就是通过页全局目录找到页表接着通过页表找到页面,诸如此类的查找映射方式。但是I[……]

阅读全文

【Linux内存源码分析】初探保护模式(2)

接下来,看看linux首次进入的保护模式的内存映射方式,然后再看一下linux是如何实现保护模式的进入,进入前做了什么准备和设置。

还是借用Intel文档中的图来说明这个保护模式的保护功能:

根据不同的段寄存器内容查找到对应的段描述符,描述符指明了此时的环境的可以通过[……]

阅读全文

【Linux内存源码分析】初探保护模式(1)

既然都说是分析x86环境的linux系统内存管理,如果不分析一下x86那绕来绕去的内存映射机制,个人感觉等于什么都没分析。其实x86的内存映射机制,说复杂也不复杂,说简单也不简单,简单点说x86内存映射莫过于就两个映射:段式映射和页式映射。其中页式映射是基于段式映射的基础上而形成的,那就意味着可以是:纯段式映射和段页式映射。这些都是简单的[……]

阅读全文

【Linux内存源码分析】内存布局探测

近期深入学习linux内核,先从内存管理下手吧,考虑到老版本的内核分析文章已经较多,于是找了一个较新的LTS内核版本尝试自行分析,这里选择了linux 3.14版本,环境主要是x86-32bit

Linux系统的内存管理是一个很复杂的工程,它不仅仅是物理内存管理,同时包括虚拟内存管理、内存交换和回收等,还有管理中的各式[……]

阅读全文