内存管理
唐古拉在高歌
斯蒂芬地方
展开
-
Linux堆内存管理深入分析
0 前言近年来,漏洞挖掘越来越火,各种漏洞挖掘、利用的分析文章层出不穷。从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种。国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢出的漏洞利用资料就很少了。鄙人以为主要是堆溢出漏洞的门槛较高,需要先吃透相应操作系统的堆内存管理机制,而这部分内容一直是一个难点。因此本系列文章主要从Linux系统堆内存管理机制出发,逐步介绍诸转载 2016-07-05 19:14:50 · 428 阅读 · 0 评论 -
vmalloc size分析
平台: msm8x25系统: android 4.1内核: 3.4.0概念由于系统的连续物理内存有限,这使得非连续物理内存的使用在linux内核中出现,这叫vmalloc机制。和前者一样,vmalloc机制中的虚拟地址也是连续的。 Vmallocinfo Vmalloc机制并不是狭义地指使用vmalloc函数分配,其他还有如iorema转载 2015-10-14 16:00:25 · 447 阅读 · 0 评论 -
保留内存(PMEM/ION)申请
chipset: msm8x25codebase: android4.1PMEM是高通使用的固定内存分配机制,ION是Google为了使各家厂商使用同一种固定内存分配机制而出现的产物。当然在ION使用的情况下,PMEM也是可以被定义使用的,主要看用户空间选择哪个了,不过两者并存实在没这个必要,毕竟很浪费内存。先看下kernel在开机的时候是如何申请这部分内存作为PMEM使用转载 2015-10-14 15:58:31 · 993 阅读 · 0 评论 -
[内存管理] linux kernel内存映射实例分析
作者:JHJ([email protected])日期:2012/08/24欢迎转载,请注明出处 引子现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex A9 + 1GB DDR似乎已经跟不上主流配置了。虽说硬件是王道,可我们还是不禁还怀疑这么强大的硬件配置得到充分利用了吗?因此以后我都会正对ARM平台分析kernel的内容。 正文转载 2015-10-14 15:40:21 · 427 阅读 · 0 评论 -
memory pool 原理及使用
chipset: msm8x25codebase: android4.1[html] view plaincopy一、 初始化: int __init memory_pool_init(void) { int i; alloc_root = RB_ROOT; mutex_init(&alloc_mutex);转载 2015-10-14 15:57:17 · 587 阅读 · 0 评论 -
bootmem allocator分析
Codebase: android 4.1Kernel: 3.4.0Chipset: msm8x25q 在系统启动时,内存的伙伴系统/slab算法还没有初始化之前,系统也需要来作内存管理,分配一些核心数据结构,bootmem分配器就实现了该功能,它用于在启动阶段早期分配内存。Bootmem分配器使用位图来管理页,位图数量和系统的物理内存也数量是相同的。当页被使用时,就标记为1,转载 2015-10-14 15:52:47 · 279 阅读 · 0 评论 -
高端内存永久映射分析
chipset: MSM8X25QCodebase: Android4.1Kernel: 3.4.0 基本概念: 当你需要将高端页面长期映射到内核空间的时候,就要使用Kmap函数来实现,即高端内存永久映射。这样避免页表和TLB的更新而导致资源的占用。 使用的时候一般先通过alloc_page(__GFP_HIGHMEM)申请一个page,然后转载 2015-10-14 15:51:50 · 313 阅读 · 0 评论 -
ION原理分析
平台: MSM8x25Q系统: Android4.1从上一篇ION基本概念中,我们了解了heaptype, heap id, client, handle以及如何使用,本篇再从原理上分析下ION的运作流程。 MSM8x25Q平台使用的是board-qrd7627.c,ION相关定义如下:[html] view plaincopy/** *转载 2015-10-14 16:02:46 · 479 阅读 · 0 评论 -
struct meminfo分析
Chipset:MSM8x25QCodebase:Android 4.1Linux Kernel: 3.4.0 在linux Kernel中,一开始内存相关的信息是由struct meminfo来保存的,每个物理连续的内存区域被保存为meminfo中的一个元素,也就是说在Linux使用中,整块物理内存可能是不连续的,可能其中某一中间区域是被其他cpu给使用掉了。转载 2015-10-14 15:53:47 · 273 阅读 · 0 评论 -
Android内存管理
前一段时间自己学习了下Android内存管理相关的东西,在部门内部做了一次技术分享。作为一个在公开场合会腼腆,上不了台面,表达能力也不行的人来说是一个不小的进步。一直很佩服墙内墙外的牛人们坚持写博客和大家分享的精神。嗯,今天就将上次的技术分享写在博客里面,希望对大家有帮助。下面分为4个部分来阐述: Android内存管理机制 Android App中内存管理优化 检测内存使用情况 内存转载 2015-10-22 11:22:33 · 327 阅读 · 0 评论 -
对/proc/buddyinfo的解释
buddyinfo的理解cat /proc/buddyinfo 显示如下:Node 0, zone DMA 0 4 5 4 4 3 ...Node 0, zone Normal 1 0 0 1 101 8 ...Node 0, zone转载 2015-09-17 11:48:57 · 966 阅读 · 0 评论 -
Linux高端内存映射(上)
高端内存概述 在32位的系统上,内核占有从第3GB~第4GB的线性地址空间,共1GB大小,内核将其中的前896MB与物理内存的0~896MB进行直接映射,即线性映射,将剩余的128M线性地址空间作为访问高于896M的内存的一个窗口。引入高端内存映射这样一个概念的主要原因就是我们所安装的内存大于1G时,内核的1G线性地址空间无法建立一个完全的直接映射来触及整个物理内存空间,而对转载 2015-10-19 10:16:18 · 437 阅读 · 0 评论 -
Linux伙伴系统(五)--通过迁移类型分组来实现反碎片
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7626670 从2.6.32.25开始,linux在伙伴管理系统中引入迁移类型(migrate type)这么一个概念,用于避免系统在长期运行过程中产生碎片。关于迁移类型的一些概念在介绍伙伴系统的数据结构的时候有提到过(见>),不过考虑转载 2015-10-19 10:13:18 · 382 阅读 · 0 评论 -
linux内核内存分配
内核中的内存分配通常通过kmalloc/kfree来进行,但是也有其它的方式来获取内存,所有这些方式共同提供了内核中分配、释放内存的接口。一、kmalloc/kfree类似于标准C中的malloc/free,kmalloc/kfree是内核中的用于常规内存分配的接口。kmalloc/kfree是工作在slab分配器的基础上的,在系统启动时会调用kmem_cache_init,该函数会创转载 2015-10-14 16:09:25 · 292 阅读 · 0 评论 -
Viewing RAM Usage Data (procstats)
The procstats tool is used to analyze application memory usage over time (versus at aparticular snapshot in time, likememinfo). Its state dump displays statistics about every application’s runtime,p转载 2015-10-14 16:59:02 · 658 阅读 · 0 评论 -
Android 查看内存情况
cat /proc/meminfocat /proc/pagetypeinfobusybox free原创 2015-10-14 14:38:16 · 360 阅读 · 0 评论 -
linux内核内存管理学习之三(slab分配器)
一、内核内存分配在linux内核中伙伴系统用来管理物理内存,其分配的单位是页,但是向用户程序一样,内核也需要动态分配内存,而伙伴系统分配的粒度又太大。由于内核无法借助标准的C库,因而需要别的手段来实现内核中动态内存的分配管理,linux采用的是slab分配器。slab分配器不仅可以提供动态内存的管理功能,而且可以作为经常分配并释放的内存的缓存。通过slab缓存,内核能够储备一些对象,供后续使用转载 2015-10-14 16:07:48 · 435 阅读 · 0 评论 -
Linux物理内存管理概述
在内核态申请内存比在用户态申请内存要更为直接,它没有采用用户态那种延迟分配内存技术。内核认为一旦有内核函数申请内存,那么就必须立刻满足该申请内存的请求,并且这个请求一定是正确合理的。相反,对于用户态申请内存的请求,内核总是尽量延后分配物理内存,用户进程总是先获得一个虚拟内存区的使用权,最终通过缺页异常获得一块真正的物理内存。1.物理内存的内核映射IA32架构中内核虚拟地址空间只有1GB大小转载 2015-12-15 09:39:06 · 485 阅读 · 0 评论 -
频繁分配释放内存导致的性能问题的分析
现象1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000。初步分析majflt代表major fault,中文名叫大错误,minflt代表minor fa转载 2015-12-15 11:56:15 · 309 阅读 · 0 评论 -
Android使用procrank和dumpsys meminfo分析内存占用情况
如果你想查看所有进程的内存使用情况,可以使用命令procrank、dumpsys meminfo查看,当然也只可以过滤出某个进程如:dumpsys meminfo | grep -i phone先来看下procrank view sourceprint?01.sh-4.2# procrank02.PID Vss转载 2015-10-06 21:18:52 · 1689 阅读 · 0 评论 -
伙伴系统分析
chipset: MSM8X25QCodebase: Android4.1Kernel: 3.4.0 基本概念: 关于伙伴系统算法的原理还是比较好理解的,这里不作复数。直接看下关键数据结构。[html] view plaincopystruct zone { ~~snip struct free_area f转载 2015-10-14 15:46:11 · 430 阅读 · 0 评论 -
linux内核内存管理学习之一(基本概念,分页及初始化)
一、概述1.虚拟地址空间内存是通过指针寻址的,因而CPU的字长决定了CPU所能管理的地址空间的大小,该地址空间就被称为虚拟地址空间,因此32位CPU的虚拟地址空间大小为4G,这和实际的物理内存数量无关。Linux内核将虚拟地址空间分成了两部分:一部分是用户进程可用的,这部分地址是地址空间的低地址部分,从0到TASK_SIZE,称为用户空间一部分是由内核保留使用的,这部分地址是地转载 2015-10-14 16:06:57 · 503 阅读 · 0 评论 -
linux内核内存管理学习之二(物理内存管理--伙伴系统)
linux使用伙伴系统来管理物理内存页。一、伙伴系统原理1. 伙伴关系定义:由一个母实体分成的两个各方面属性一致的两个子实体,这两个子实体就处于伙伴关系。在操作系统分配内存的过程中,一个内存块常常被分成两个大小相等的内存块,这两个大小相等的内存块就处于伙伴关系。它满足 3 个条件 : 两个块具有相同大小记为 2^K 它们的物理地址是连续的 从同一个大块中拆分出来2. 伙转载 2015-10-14 16:06:00 · 629 阅读 · 0 评论 -
OOM(out_of_memory) killer分析
Chipset: MSM8X25QCodebase: Android4.1Kernel: 3.4.0 概念: OOMkiller,即out of memory killer,是linux下面的一种管理当内存耗尽时的处理机制。当内存较少时,OOM会遍历整个进程链表,然后根据进程的内存使用情况以及它的oom score值最终找到得分较高的进程,然后发送kill信号将转载 2015-10-14 15:50:19 · 677 阅读 · 0 评论 -
Low Memory Killer分析
Chipset: MSM8X25QCodebase: Android4.1Kernel: 3.4.0 概念: Lowmemory killer是android基于oom killer做了改进。两者区别:Oom killer: 当系统内存不足时,会根据当前进程的内存使用状况以及oom score来Kill掉某个进程。Low memorykiller: 会周转载 2015-10-14 15:47:43 · 447 阅读 · 0 评论 -
ION基本概念介绍
chipset: MSM8X25Qcodebase: Android 4.1ION概念: ION是Google的下一代内存管理器,用来支持不同的内存分配机制,如CARVOUT(PMEM),物理连续内存(kmalloc), 虚拟地址连续但物理不连续内存(vmalloc), IOMMU等。用户空间和内核空间都可以使用ION,用户空间是通过/dev/ion来创建client的。转载 2015-10-14 16:01:43 · 877 阅读 · 0 评论 -
PMEM原理分析
Chipset:MSM8x25QCodebase:Android 4.1PMEM使用:PMEM使用比较简单,分单进程使用和共享进程使用同一块PMEM。单进程使用:1. int master_fd = open(“/dev/pmem_xxx”,O_RDWR, 0);2. 然后再mmap就可以使用了。进程间共享PMEM:进程A:转载 2015-10-14 15:55:08 · 371 阅读 · 0 评论 -
Linux伙伴系统(二)--伙伴系统的初始化
水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7611585 伙伴系统的初始化主要是初始化之前介绍的伙伴系统涉及到的数据结构,并且把系统初始化时由bootmem allocator管理的低端内存以及系统的高端内存释放到伙伴系统中去。其中有些和zone相关的域在前面>中已经有所介绍。转载 2015-10-19 10:10:35 · 350 阅读 · 0 评论 -
Linux页表机制初始化
Linux启动并建立一套完整的页表机制要经过以下几个步骤:1.临时内核页表的初始化(setup_32.s)2.启动分页机制(head_32.s)3.建立低端内存和高端内存固定映射区的页表( init_memory_mapping())4.建立高端内存永久映射区的页表并获取固定映射区的临时映射区页表(paging_init())下面主要介绍3和4转载 2015-10-19 10:20:25 · 841 阅读 · 1 评论 -
Linux物理内存概述
Linux可以支持大量的架构,所以需要用一种与架构无关的方式去描述内存。在linux的内存管理中,我们首先要明确的一个概念就是NUMA(Non-Uniform Memory Access,关于NUMA的介绍可以参考我前面的文章)。很多大型机器都采用NUMA架构,将内存和CPU分为很多组,每一组称为一个节点(node)。节点与节点之间的互相访问,会因为“距离”的不同导致不同的开销。Linux通过st转载 2014-04-14 11:36:13 · 606 阅读 · 0 评论 -
Linux内存管理之mmap详解
一. mmap系统调用1. mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.转载 2015-09-05 23:34:44 · 364 阅读 · 0 评论 -
Android PMem 和Ashmem 介绍
1、Ashmem(匿名共享内存驱动:Anonymous Shared Memory)它基于mmap系统调用,不同进程可以将同一段物理内存映射到各自的虚拟地址控制,从而实现共享A、(mmap:是一种共享内存的系统。假如:A进程的内存空间范围0X0000~0XFFFF,B进程的内存空间范围0X0000~0XFFFF,他们两个进程想共同共享一个文件或一段空间时,可以使用mma转载 2015-09-06 00:26:08 · 447 阅读 · 0 评论 -
巧妇能为少米之炊(3)——压缩饼干(ZRAM)
这个是我认为小内存处理中比较靠谱的方式——zram。它就像压缩饼干一样,虽然小小一块饼干看起来不大(zram的压缩页面占用内存),但是一喝水,感觉立马饱了(释放一个页面的内容)。1.简介2.如何使能3.工作流程4.还有什么能做的?简介:zram就是在发生swap事件的时候,不把要置换的页面置换到外部存储中,手机中的外部存储就是EMMC,电脑中的外部存转载 2015-09-05 17:44:02 · 728 阅读 · 0 评论 -
mmap那些事之android property实现之二
1 基于tmpfs的mmap系统调用过程前面一篇blog:mmap那些事之android property实现,讲述了android的属性系统是基于tmpfs的mmap来实现内存的共享,只是论述了应用层的使用,并未涉及到内核空间是怎么处理的。包括如下几个问题:mmap系统调用过程tmpfs文件针对mmap做了哪些处理?这里包括tmpfs是怎样分配实际的物理内存到共享转载 2015-03-19 18:16:07 · 634 阅读 · 0 评论 -
Lowmemorykiller笔记
从zygote孵化出来的进程都会记录在ActivityManagerService.mLruProcesses列表中,由ActivityManagerService进行统一管理,ActivityManagerService核心业务之一便是时时更新进程的状态,根据状态计算出进程对应的OomAdj值,这个值会传递到kernel中去,kernel有个低内存回收机制,在内存达到一定阀值时会触发清理OomA转载 2015-09-05 17:49:22 · 822 阅读 · 0 评论 -
Linux内存管理
摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法。力求从外到内、水到渠成地引导网友分析Linux的内存管理与使用。在本章最后,我们给出一个内存映射的实例,帮助网友们理解内核内存管理与用户内存管理之间的关系,希望大家最终能驾驭Linux内存管理。前言内存管理一向是所有操作系统书籍不惜笔墨重点讨论的内容转载 2014-04-21 11:03:20 · 650 阅读 · 0 评论 -
巧妇能为少米之炊(2)——幽灵侩子手(LMK)
使用安卓的朋友可能会遇到过这样的问题,就是某个应用正在使用,突然它被关闭了,或者打开某个应用,然后它就退出了,其实这背后就是LMK(Low Memory Killer)在起作用,所有形象地称之为幽灵刽子手。1.版本平台2.概念3.核心结构及调用4.总结版本平台平台:高通MSM8974安卓版本:4.4Linux内核版本:3.4.4文件路径:转载 2015-09-05 17:36:58 · 510 阅读 · 0 评论 -
Low Memory Killer(低内存管理)
对于PC来说,内存是至关重要。如果某个程序发生了内存泄漏,那么一般情况下系统就会将其进程Kill掉。Linux中使用一种名称为OOM(Out Of Memory,内存不足)的机制来完成这个任务,该机制会在系统内存不足的情况下,选择一个进程并将其Kill掉。Android则使用了一个新的机制——Low Memory Killer来完成同样的任务。下面首先来看看Low Memory Killer机制的转载 2015-09-05 17:15:43 · 1678 阅读 · 0 评论 -
ARM MMU页表框架
先上一张arm mmu的页表结构的通用框图(以下的论述都由该图来逐渐展开):以上是arm的页表框图的典型结构:即是二级页表结构:其中第一级页表(L1)是由虚拟地址的高12bit(bits[31:20])组成,所以第一级页表有4096个item,每个item占4个字节,所以一级页表的大小为16KB,而在第一级页表中的每个entry的最低2bit可以用来区分具体是什么种类的转载 2015-09-07 22:30:54 · 725 阅读 · 0 评论 -
kmap的实现分析与实验
kmap的实现分析kmap/unkmap系统调用是用来映射高端物理内存页到内核地址空间的api函数,他们分配的内核虚拟地址范围属于[PKMAP_BASE,PAGE_OFFSET]即[0xbfe00000,0xc0000000]范围,大小是2M的虚拟空间,为了映射该块虚拟地址,所使用的二级页表的大小刚好是一个物理page的总计是两个pte table(4KB)kmap的调用流程分析:转载 2015-03-19 18:17:44 · 659 阅读 · 0 评论