Fork me on GitHub

随笔分类 -  Memory Management

摘要:Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先讨论外部碎片问题。避免外部碎片的方法有两种:一种是之前介绍过的利用非连续内存的分配;另外一种则是用一种有效的方法来监视内存,保 阅读全文
posted @ 2020-06-24 13:46 yooooooo 阅读(2401) 评论(0) 推荐(0) 编辑
摘要:大概的简述一下,及cpu读取内存里的东西时,并不会直接去内存去读取,这样会导致读取的数据很慢。cpu会到一级缓存读取所需要的数据,而一级缓存则会去内存里面读取数据,读取的方式是通过缓存行(cache line)的形式来进行读取。当一级缓存内的数据需要置换时,则会将缓存内的数据置换到二级缓存内,然后依 阅读全文
posted @ 2020-06-23 21:33 yooooooo 阅读(989) 评论(0) 推荐(0) 编辑
摘要:crash 是目前广泛使用的 linux 内核崩溃转储文件的分析工具,掌握 crash 的使用技巧,对于分析定位内核崩溃的问题,有着非常重要的作用。本文首先介绍了 crash 的基本概念和安装方法,其次详细介绍了如何使用 crash 工具分析内核崩溃转储文件,包括各种常用调试命令的使用方法,最后以几 阅读全文
posted @ 2020-06-14 08:57 yooooooo 阅读(1480) 评论(0) 推荐(0) 编辑
摘要:你应该曾经纠结过是用kmalloc(),还是vmalloc()?现在你不用那么纠结了,因为内核里面现在有个API叫kvmalloc(),可以认为是kmalloc()和vmalloc()的双剑合一。屠龙刀和倚天剑的合体。 内核里面有大量的代码现在都使用了kvmalloc(),譬如: source/ip 阅读全文
posted @ 2020-06-10 20:03 yooooooo 阅读(1714) 评论(0) 推荐(0) 编辑
摘要:内核中常用的分配物理内存页面的接口函数是alloc_pages(),用于分配一个或者多个连续的物理页面,分配页面个数只能是2个整数次幂。相比于多次分配离散的物理页面,分配连续的物理页面有利于提高系统内存的碎片化,内存碎片化是一个很让人头疼的问题。alloc_pages()函数有两个,一个是分配gfp 阅读全文
posted @ 2020-05-16 15:09 yooooooo 阅读(1016) 评论(0) 推荐(0) 编辑
摘要:ARM64架构处理器采用48位物理寻址机制,最大可以寻找到256TB的物理地址空间。对于目前的应用来说已经足够了,不需要扩展到64位的物理地址寻址。虚拟地址也同样最大支持48位支持,所以在处理器的架构设计上,把虚拟地址空间划分为两个空间,每个空间最大支持256TB。Linux内核在大多数体系结构中都 阅读全文
posted @ 2020-05-11 09:06 yooooooo 阅读(4641) 评论(1) 推荐(0) 编辑
摘要:Linux内核在启动时会打印出内核内存空间的布局图,下面是ARM Vexpress平台打印出来的内存空间布局图: 这部分信息打印是在mem_init()函数中实现的。 编译器在编译目标文件并且链接完成之后,就可以知道内核映像文件最终的大小,接下来打包成二进制文件,该操作由 控制,其中也划定了内核的内 阅读全文
posted @ 2020-05-09 14:48 yooooooo 阅读(1790) 评论(0) 推荐(0) 编辑
摘要:在内存系统初始化过程中,有如下代码: 这里,我们看到了神秘的swapper_pg_dir,全局搜索一下,发现了 在head_32.S中,定义了如下的BSS段,BSS段是在内核映像文件中不占空间,但是在内核被加载到内存时,会保留相应的空间。 在BSS段,一共保留了4个页面的空间,分别用initial_ 阅读全文
posted @ 2020-05-04 16:42 yooooooo 阅读(1930) 评论(0) 推荐(0) 编辑
摘要:在32bit中的Linux内核中一般采用3层映射模型,第1层是页面目录(PGD),第2层是页面中间目录(PMD),第3层才是页面映射表(PTE)。 但在ARM32系统中只用到两层映射,因此在实际代码中就要3层映射模型中合并一层 。在ARM32架构中,可以按段(section)来映射,这时采用单层映射 阅读全文
posted @ 2020-05-03 11:19 yooooooo 阅读(1974) 评论(0) 推荐(1) 编辑
摘要:1、PGD: Page Global Directory Linux系统中每个进程对应用户空间的pgd是不一样的,但是linux内核 的pgd是一样的。当创建一个新的进程时,都要为新进程创建一个新的页面目录PGD,并从内核的页面目录swapper_pg_dir中复制内核区间页面目录项至新建进程页面目 阅读全文
posted @ 2020-04-27 11:28 yooooooo 阅读(8834) 评论(0) 推荐(2) 编辑
摘要:类似于从zone中的分配,如果无法从指定的迁移类型分配到页,则会按照fallbacks指定的次序从备用迁移类型中尝试分配,它定义在page_alloc.c中。 虽然该特性总是编译进去的,但是该特性只有在系统中有足够的内存可以分配到每种迁移类型对应的链表时才有意义,也就是说每个可以迁移性链表都要有“适 阅读全文
posted @ 2020-04-12 20:18 yooooooo 阅读(1604) 评论(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 阅读(1217) 评论(0) 推荐(0) 编辑
摘要:在直接内存回收过程中,有可能会造成当前需要分配内存的进程被加入一个等待队列,当整个node的空闲页数量满足要求时,由kswapd唤醒它重新获取内存。这个等待队列头就是node结点描述符pgdat中的pfmemalloc_wait。如果当前进程加入到了 这个等待队列中,那么进程就不会进行直接内存回收, 阅读全文
posted @ 2020-04-11 13:55 yooooooo 阅读(585) 评论(0) 推荐(0) 编辑
摘要:内核中把物理内存的低端区域作为直接映射区,高地址区域定义为高端内存,通过一个变量high_memory来界定他们的分界线。high_memory是一个虚拟地址,定义了高端内存被允许映射到内核的起始地址。 它在arm平台上的定义如下: 阅读全文
posted @ 2020-04-06 20:57 yooooooo 阅读(655) 评论(0) 推荐(0) 编辑
摘要:1.概述 Android底层还是基于Linux,在Linux中低内存是会有oom killer去杀掉一些进程去释放内存,而Android中的lowmemorykiller就是在此基础上做了一些调整来的。因为手机上的内存毕竟比较有限,而Android中APP在不使用之后并不是马上被杀掉,虽然上层Act 阅读全文
posted @ 2020-03-29 17:07 yooooooo 阅读(2906) 评论(0) 推荐(1) 编辑
摘要:![image](https://img-blog.csdn.net/20180330131548259) 阅读全文
posted @ 2020-03-24 23:10 yooooooo 阅读(722) 评论(0) 推荐(0) 编辑
摘要:前面已经分析了伙伴管理算法的释放实现,接着分析一下伙伴管理算法的内存申请实现。 伙伴管理算法内存申请和释放的入口一样,其实并没有很清楚的界限表示这个函数是入口,而那个不是,所以例行从稍微偏上一点的地方作为入口分析。于是选择了alloc_pages()宏定义作为分析切入口: 而alloc_pages_ 阅读全文
posted @ 2020-03-22 21:51 yooooooo 阅读(508) 评论(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 阅读(2286) 评论(0) 推荐(0) 编辑
摘要:伙伴系统 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表。四级页表分别为: 页全局目录(Page Global Directory) 页上级目录(Page Upper Directory) 页中间目录 阅读全文
posted @ 2020-03-08 21:46 yooooooo 阅读(2952) 评论(0) 推荐(0) 编辑
摘要:文件页 内存回收,也就是系统释放掉可以回收的内存,比如缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File backed Page)。大部分文件页,都可以直接回收,以后有需要时,再从磁盘重新读取就可以了。 脏页 那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页), 阅读全文
posted @ 2019-12-18 23:20 yooooooo 阅读(5251) 评论(2) 推荐(0) 编辑