Fork me on GitHub

随笔分类 -  Memory Management

摘要:此处承接前面未深入分析的页面释放部分,主要详细分析伙伴管理算法中页面释放的实现。页面释放的函数入口是__free_page(),其实则是一个宏定义。 具体实现: 而__free_pages()的实现: 其中put_page_testzero()是对page结构的_count引用计数做原子减及测试,用 阅读全文
posted @ 2019-12-18 23:07 yooooooo 阅读(598) 评论(0) 推荐(0) 编辑
摘要:前面分析了伙伴管理算法的初始化,在切入分析代码实现之前,例行先分析一下其实现原理。 伙伴管理算法(也称之为Buddy算法),该算法将所有空闲的页面分组划分为MAX_ORDER个页面块链表进行管理,其中MAX_ORDER定义: 通常该值都是定义为11,而CONFIG_FORCE_MAX_ZONEORD 阅读全文
posted @ 2019-10-14 09:54 yooooooo 阅读(560) 评论(0) 推荐(0) 编辑
摘要:前面已经分析了linux内存管理算法(伙伴管理算法)的准备工作。 具体的算法初始化则回到start_kernel()函数接着往下走,下一个函数是mm_init(): 乍看仅仅是几个函数的调用,实际上这里的事情远远没这么简单。其中page_cgroup_init_flatmem()与cgroup相关, 阅读全文
posted @ 2019-10-07 11:02 yooooooo 阅读(497) 评论(0) 推荐(0) 编辑
摘要:前面分析了memblock算法、内核页表的建立、内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征。而start_kernel()接下来的初始化则是linux通用的内存管理算法框架了。 build_all_zonelists()用来初始化 阅读全文
posted @ 2019-10-07 10:19 yooooooo 阅读(669) 评论(0) 推荐(0) 编辑
摘要:文件页 内存回收,也就是系统释放掉可以回收的内存,比如缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File backed Page)。大部分文件页,都可以直接回收,以后有需要时,再从磁盘重新读取就可以了。 脏页 那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页), 阅读全文
posted @ 2019-10-06 23:03 yooooooo 阅读(448) 评论(0) 推荐(0) 编辑
摘要:前面已经分析了内存管理框架的构建实现过程,有部分内容未完全呈现出来,这里主要做个补充。 如下图,这是前面已经看到过的linux物理内存管理框架的层次关系。 现着重分析一下各个管理结构体的成员功能作用。 struct zone node_zones[MAX_NR_ZONES]; ——存放该pg_dat 阅读全文
posted @ 2019-10-06 22:55 yooooooo 阅读(366) 评论(0) 推荐(0) 编辑
摘要:虽说前文分析内存管理框架构建的实现,提到了find_zone_movable_pfns_for_nodes(),但这里不准备复述什么,仅针对required_movablecore和required_kernelcore做一个补充。 以required_movablecore为例,代码中没有很清晰地 阅读全文
posted @ 2019-10-06 22:32 yooooooo 阅读(343) 评论(0) 推荐(0) 编辑
摘要:此处接前文,分析free_area_init_nodes()函数最后部分,分析其末尾的循环: 这里面的关键函数是free_area_init_node(),其入参find_min_pfn_for_node()用于获取node节点中最低的内存页框号。 而free_area_init_node()其实现 阅读全文
posted @ 2019-10-05 17:29 yooooooo 阅读(478) 评论(0) 推荐(0) 编辑
摘要:前面构建内存管理框架,已经将内存管理node节点设置完毕,接下来将是管理区和页面管理的构建。此处代码实现主要在于setup_arch()下的一处钩子:x86_init.paging.pagetable_init()。据前面分析可知x86_init结构体内该钩子实际上挂接的是native_pageta 阅读全文
posted @ 2019-10-05 16:59 yooooooo 阅读(516) 评论(0) 推荐(0) 编辑
摘要:传统的计算机结构中,整个物理内存都是一条线上的,CPU访问整个内存空间所需要的时间都是相同的。这种内存结构被称之为UMA(Uniform Memory Architecture,一致存储结构)。但是随着计算机的发展,一些新型的服务器结构中,尤其是多CPU的情况下,物理内存空间的访问就难以控制所需的时 阅读全文
posted @ 2019-10-04 16:34 yooooooo 阅读(670) 评论(0) 推荐(0) 编辑
摘要:前面已经分析了内核页表的准备工作以及内核低端内存页表的建立,接着回到init_mem_mapping()中,低端内存页表建立后紧随着还有一个函数early_ioremap_page_table_range_init(): 该函数主要是用于建立固定内存映射区的。固定内存映射区是指FIXADDR_STA 阅读全文
posted @ 2019-10-04 11:00 yooooooo 阅读(619) 评论(0) 推荐(0) 编辑
摘要:前面的前奏已经分析介绍了建立内核页表相关变量的设置准备,接下来转入正题分析内核页表的建立。 建立内核页表的关键函数init_mem_mapping(): init_mem_mapping()里面关键操作有三个split_mem_range()、kernel_physical_mapping_init 阅读全文
posted @ 2019-09-29 09:30 yooooooo 阅读(725) 评论(0) 推荐(0) 编辑
摘要:前面已经分析过了Intel的内存映射和linux的基本使用情况,已知head_32.S仅是建立临时页表,内核还是要建立内核页表,做到全面映射的。下面就基于RAM大于896MB,而小于4GB ,切CONFIG_HIGHMEM配置了高端内存的环境情况进行分析。 建立内核页表前奏,了解两个很关键的变量: 阅读全文
posted @ 2019-09-28 17:14 yooooooo 阅读(953) 评论(0) 推荐(0) 编辑
摘要:memory:表示可用可分配的内存; 结束完memblock算法初始化前的准备工作,回到memblock算法初始化及其算法实现上面。memblock是一个很简单的算法。 memblock算法的实现是,它将所有状态都保存在一个全局变量__initdata_memblock中,算法的初始化以及内存的申请 阅读全文
posted @ 2019-09-24 16:32 yooooooo 阅读(1062) 评论(0) 推荐(3) 编辑
摘要:memblock算法是linux内核初始化阶段的一个内存分配器(它取代了原来的bootmem算法),实现较为简单。负责page allocator初始化之前的内存管理和分配请求。 分析memblock算法,可以从几点入手: 1. memblock算法初始化; 2. memblock算法管理内存的申请 阅读全文
posted @ 2019-09-23 22:48 yooooooo 阅读(495) 评论(0) 推荐(1) 编辑
摘要:本文讨论的 swap基于Linux4.4内核代码 。Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑。 希望本文能让读者了解Linux对swap的使用大概是什么样子。阅读完本文,应该可以帮你解决以下问题: 1. swap到底是干嘛的? 2. swappiness到底是用来 阅读全文
posted @ 2019-09-18 15:22 yooooooo 阅读(1845) 评论(0) 推荐(1) 编辑
摘要:对于不同的体系结构,Linux采用的四级页表目录的大小有所不同:对于i386而言,仅采用二级页表,即页上层目录和页中层目录长度为0;对于启用PAE的i386,采用了三级页表,即页上层目录长度为0;对于64位体系结构,可以采用三级或四级页表,具体选择由硬件决定。 对于没有启用物理地址扩展的32位系统, 阅读全文
posted @ 2019-08-27 15:40 yooooooo 阅读(414) 评论(0) 推荐(0) 编辑
摘要:我们在前面的章节中已经详细介绍了堆在进程中的地址空间是如何分布的,对于程序来说,堆空间只是程序向操作系统申请划出来的一大块地址空间。而程序在通过 malloc申请 内存空间时的大小却是不一定的,从数个字到数个GB都是有可能的。于是我们必须将堆空间管理起来,将它分块地按照用户需求出售给最终的程序,并且 阅读全文
posted @ 2019-03-31 18:00 yooooooo 阅读(2495) 评论(1) 推荐(0) 编辑
摘要:内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点。 修改(2015 11 12):Linux的虚拟内存管理是基于mmap来实现的。vm_area_struct是在mmap的时候创建的,vm_area_strcut代表了一段连续 阅读全文
posted @ 2019-03-31 17:06 yooooooo 阅读(8395) 评论(1) 推荐(3) 编辑
摘要:一、为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已。spin lock严格的限制只有一个thread可以进入临界区,但是实际中,有些对共享资源的访问可以严格区分读和写的,这时候,其实多个读 阅读全文
posted @ 2019-03-07 23:09 yooooooo 阅读(738) 评论(0) 推荐(0) 编辑