Fork me on GitHub
侧边栏

随笔分类 -  Memory Management

上一页 1 ··· 3 4 5 6 7 8 9 10 下一页
摘要:类似于从zone中的分配,如果无法从指定的迁移类型分配到页,则会按照fallbacks指定的次序从备用迁移类型中尝试分配,它定义在page_alloc.c中。 虽然该特性总是编译进去的,但是该特性只有在系统中有足够的内存可以分配到每种迁移类型对应的链表时才有意义,也就是说每个可以迁移性链表都要有“适 阅读全文
posted @ 2020-04-12 20:18 yooooooo 阅读(1937) 评论(0) 推荐(0)
摘要:承接内存管理相关概念讲解相关数据结构。主要有 pg_data_t: 表示节点; zone: 内存域; page: 页帧; pglist_data定义如下: node_zones是一个数组,包含节点中各内存域(ZONE_DMA, ZONE_DMA32, ZONE_NORMAL...)的数据结构; no 阅读全文
posted @ 2020-04-11 14:22 yooooooo 阅读(1388) 评论(0) 推荐(0)
摘要:在直接内存回收过程中,有可能会造成当前需要分配内存的进程被加入一个等待队列,当整个node的空闲页数量满足要求时,由kswapd唤醒它重新获取内存。这个等待队列头就是node结点描述符pgdat中的pfmemalloc_wait。如果当前进程加入到了 这个等待队列中,那么进程就不会进行直接内存回收, 阅读全文
posted @ 2020-04-11 13:55 yooooooo 阅读(663) 评论(0) 推荐(0)
摘要:内核中把物理内存的低端区域作为直接映射区,高地址区域定义为高端内存,通过一个变量high_memory来界定他们的分界线。high_memory是一个虚拟地址,定义了高端内存被允许映射到内核的起始地址。 它在arm平台上的定义如下: 阅读全文
posted @ 2020-04-06 20:57 yooooooo 阅读(752) 评论(0) 推荐(0)
摘要:1.概述 Android底层还是基于Linux,在Linux中低内存是会有oom killer去杀掉一些进程去释放内存,而Android中的lowmemorykiller就是在此基础上做了一些调整来的。因为手机上的内存毕竟比较有限,而Android中APP在不使用之后并不是马上被杀掉,虽然上层Act 阅读全文
posted @ 2020-03-29 17:07 yooooooo 阅读(3689) 评论(0) 推荐(1)
摘要:![image](https://img-blog.csdn.net/20180330131548259) 阅读全文
posted @ 2020-03-24 23:10 yooooooo 阅读(745) 评论(0) 推荐(0)
摘要:前面已经分析了伙伴管理算法的释放实现,接着分析一下伙伴管理算法的内存申请实现。 伙伴管理算法内存申请和释放的入口一样,其实并没有很清楚的界限表示这个函数是入口,而那个不是,所以例行从稍微偏上一点的地方作为入口分析。于是选择了alloc_pages()宏定义作为分析切入口: 而alloc_pages_ 阅读全文
posted @ 2020-03-22 21:51 yooooooo 阅读(572) 评论(0) 推荐(0)
摘要:[linux内核分析———SLAB原理及实现 ](https://blog.csdn.net/chenxiancool/article/details/7638804) Slab原理及实现 1. 整体关系图 ! 注:SLAB,SLOB,SLUB都是内核提供的分配器,其前端接口都是一致的,其中SLAB 阅读全文
posted @ 2020-03-15 20:00 yooooooo 阅读(2557) 评论(0) 推荐(0)
摘要:伙伴系统 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表。四级页表分别为: 页全局目录(Page Global Directory) 页上级目录(Page Upper Directory) 页中间目录 阅读全文
posted @ 2020-03-08 21:46 yooooooo 阅读(3502) 评论(0) 推荐(0)
摘要:文件页 内存回收,也就是系统释放掉可以回收的内存,比如缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File backed Page)。大部分文件页,都可以直接回收,以后有需要时,再从磁盘重新读取就可以了。 脏页 那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页), 阅读全文
posted @ 2019-12-18 23:20 yooooooo 阅读(5895) 评论(2) 推荐(0)
摘要:此处承接前面未深入分析的页面释放部分,主要详细分析伙伴管理算法中页面释放的实现。页面释放的函数入口是__free_page(),其实则是一个宏定义。 具体实现: 而__free_pages()的实现: 其中put_page_testzero()是对page结构的_count引用计数做原子减及测试,用 阅读全文
posted @ 2019-12-18 23:07 yooooooo 阅读(693) 评论(0) 推荐(0)
摘要:前面分析了伙伴管理算法的初始化,在切入分析代码实现之前,例行先分析一下其实现原理。 伙伴管理算法(也称之为Buddy算法),该算法将所有空闲的页面分组划分为MAX_ORDER个页面块链表进行管理,其中MAX_ORDER定义: 通常该值都是定义为11,而CONFIG_FORCE_MAX_ZONEORD 阅读全文
posted @ 2019-10-14 09:54 yooooooo 阅读(606) 评论(0) 推荐(0)
摘要:前面已经分析了linux内存管理算法(伙伴管理算法)的准备工作。 具体的算法初始化则回到start_kernel()函数接着往下走,下一个函数是mm_init(): 乍看仅仅是几个函数的调用,实际上这里的事情远远没这么简单。其中page_cgroup_init_flatmem()与cgroup相关, 阅读全文
posted @ 2019-10-07 11:02 yooooooo 阅读(581) 评论(0) 推荐(0)
摘要:前面分析了memblock算法、内核页表的建立、内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征。而start_kernel()接下来的初始化则是linux通用的内存管理算法框架了。 build_all_zonelists()用来初始化 阅读全文
posted @ 2019-10-07 10:19 yooooooo 阅读(742) 评论(0) 推荐(0)
摘要:文件页 内存回收,也就是系统释放掉可以回收的内存,比如缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File backed Page)。大部分文件页,都可以直接回收,以后有需要时,再从磁盘重新读取就可以了。 脏页 那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页), 阅读全文
posted @ 2019-10-06 23:03 yooooooo 阅读(479) 评论(0) 推荐(0)
摘要:先说说cpu的cache,和cpu的cache比起来访问主内存是非常慢的,为了加快速度根据本地性原则,cpu在访问主内存的时候会把附近的一块数据都加载到cpu的cache里,之后读写这块数据都是在cache里做的。 linux本来有伙伴系统分配内存页,为了加快单个内存页的分配linux在每个node 阅读全文
posted @ 2019-10-06 23:00 yooooooo 阅读(546) 评论(0) 推荐(0)
摘要:前面已经分析了内存管理框架的构建实现过程,有部分内容未完全呈现出来,这里主要做个补充。 如下图,这是前面已经看到过的linux物理内存管理框架的层次关系。 现着重分析一下各个管理结构体的成员功能作用。 struct zone node_zones[MAX_NR_ZONES]; ——存放该pg_dat 阅读全文
posted @ 2019-10-06 22:55 yooooooo 阅读(396) 评论(0) 推荐(0)
摘要:虽说前文分析内存管理框架构建的实现,提到了find_zone_movable_pfns_for_nodes(),但这里不准备复述什么,仅针对required_movablecore和required_kernelcore做一个补充。 以required_movablecore为例,代码中没有很清晰地 阅读全文
posted @ 2019-10-06 22:32 yooooooo 阅读(368) 评论(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 阅读(524) 评论(0) 推荐(0)
摘要:前面构建内存管理框架,已经将内存管理node节点设置完毕,接下来将是管理区和页面管理的构建。此处代码实现主要在于setup_arch()下的一处钩子:x86_init.paging.pagetable_init()。据前面分析可知x86_init结构体内该钩子实际上挂接的是native_pageta 阅读全文
posted @ 2019-10-05 16:59 yooooooo 阅读(578) 评论(0) 推荐(0)

上一页 1 ··· 3 4 5 6 7 8 9 10 下一页