内存管理
文章平均质量分 73
Robin.Yin
一只勤勉的小虫,如痴如醉地沉迷于书卷,孜孜不倦地咀嚼着文字-书虫
展开
-
Linux cgroup源码分析<一>概述
1. cgroup子系统子系统的介绍blkio -- 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。cpu -- 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。cpuacct -- 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。cpuset -- 这个子系统为 cgroup 中的任务分配独立 C...原创 2020-11-05 23:45:15 · 1197 阅读 · 0 评论 -
Linux故障排查总结
原创 2020-07-10 09:08:39 · 342 阅读 · 0 评论 -
Linux X86_64 内核态缺页处理
Linux X86针对meltdown漏洞开启了页表隔离(PTI)功能,PTI使用两个PGD来表示进程空间.进程在陷入内核态时,CR3会相应的切换到进程内核态的PGD页表.假如进程调用了vmalloc分配内存,此时会进行页表映射,但是vmalloc是把这块内存映射到了内核的虚拟地址空间(init_mm),并没有映射到当前进程的内核态页表.vmalloc->__vmalloc_nod...原创 2020-04-05 14:59:29 · 863 阅读 · 0 评论 -
linux ARM64开启kaslr地址转换
addr_run = addr_link + offset //开启KASLRaddr_run = addr_link + _text - (KIMAG_VADDR+TEXT_OFFSET)//_text为重定向后的值addr_link = addr_run - _text_start + (vmalloc_start+TEX_OFFSET)//ARM64 KIMAGE_VADDR==vmal...原创 2020-03-07 17:59:08 · 914 阅读 · 0 评论 -
linux 64虚拟地址分布
如今打开kaslr, kernel image大小为1G.ARM64 的虚拟地址分布原创 2020-03-07 15:53:13 · 588 阅读 · 0 评论 -
Linux用户空间内存泄露调试手段
用户空间进程内存泄露检测原理,以及常用工具Linux的valgrind工具功能强大,对内存泄露,内存越界都能较好的检查可以访问官网下载源码和user manual原创 2018-12-13 10:59:50 · 284 阅读 · 0 评论 -
Linux 下meminfo结点解析
通过cat /proc/meminfo可以看到内存的使用情况重点域解析MemTotal:伙伴系统总内存大小(totalram_pages),这里总内存不包含预留内存(memblock_reserve),以及在调用free_all_bootmem释放内存到伙伴系统之前,通过memblock_alloc分配的内存,如果想回到伙伴系统,需要调用memblock_free_lateMemFre...原创 2018-12-13 17:16:23 · 2059 阅读 · 0 评论 -
Linux内核堆栈分配方式导致的panic分析
在移植NFC驱动时遇到系统panic的问题,查看堆栈信息,发现是i2c传输导致。可以看出,在i2c read时出现DMA映射异常,这份驱动已经在其他平台使用过,为什么在新平台i2c会出现异常了?首先看pn544_dev_read实现, 定义局部数组char tmp [512],传递给i2c_master_read函数,感觉很多驱动都是这么写的,也从没有出现过错误.static ...原创 2018-12-13 09:40:13 · 1723 阅读 · 0 评论 -
Linux内核KASAN内存检测原理
[深度好文,直接转过来]1. 前言KASAN是一个动态检测内存错误的工具。KASAN可以检测全局变量、栈、堆分配的内存发生越界访问等问题。功能比SLUB DEBUG齐全并且支持实时检测。越界访问的严重性和危害性通过我之前的文章(SLUB DEBUG技术)应该有所了解。正是由于SLUB DEBUG缺陷,因此我们需要一种更加强大的检测工具。难道你不想吗?KASAN就是其中一种。KASAN的使用...转载 2018-11-28 12:25:09 · 2592 阅读 · 0 评论 -
Linux内存回收之LRU链表和第二次机会法
一 LRU回收算法内存回收的核心是围绕LRU链表来进行操作,Linux内核实现了5种LRU链表类型1. 不活跃匿名页表链表(LRU_INACTIVE_ANON)//shmem2. 活跃匿名页表链表(LRU_ACTIVE_ANON)//3. 不活跃文件映射页表链表(LRU_INACTIVE_FILE)4. 活跃文件映射页表链表(LRU_ACTIVE_FILE)5. 不可回收...原创 2018-11-27 10:13:21 · 3027 阅读 · 0 评论 -
crash调试内核模块
WIFI 模块出现panic时,怎么根据fulldump去分析wifi问题,以及怎么调试wlan的ko文件?这里介绍Linux下的crash工具来分析fulldump,当然也可以用trace32,gdb等其他工具.1. 安装crash工具 下载代码:git clone https://github.com/crash-utility/crash.git...原创 2018-07-12 16:38:35 · 4544 阅读 · 0 评论 -
Linux 内存管理mem cgroup分析
待分析...原创 2018-11-21 19:07:07 · 5163 阅读 · 0 评论 -
Linux OOM/LMK 原理分析
伙伴系统无法分配内存时,会通过OOM函数直接kill线程来回收内存.快速分配->慢速分配->kswap内存回收->内存规整->直接内存回收->out_of_memory__alloc_pages_nodemask->__alloc_pages_slowpath->__alloc_pages_direct_compact ...原创 2018-12-13 19:06:55 · 1426 阅读 · 1 评论 -
Linux通用内存分配器genalloc
内核的genalloc是给一些需要自己维护内存分配的内核模块使用的,如SRAM, TCM, Shared-memory,ION等,内存可以通过预留,或者从伙伴系统分配,然后添加到memory pool。它提供了最先适配 fist-fit和最佳匹配 best-fit两种分配算法。irst-fit 和 best-fit这两种都是通过Bitmap来标记内存中每个分配单元的状态,空闲或已分配。 最...原创 2018-12-28 16:48:49 · 2119 阅读 · 0 评论 -
Linux内存泄露之kmemleak原理分析与使用
1. kmemleak原理: 通过分析内存块是否存在引用(指针)来判断内存泄露.1.1 扫描区域 首先要理解整个内核虚拟地址空间是怎么分布的,内核地址空间分布:Virtual kernel memory layout:vmalloc : 0xffffff8000000000 - 0xffffffbdbfff0000 ( 246 GB)vmemmap : 0xf...原创 2018-12-12 11:28:43 · 5186 阅读 · 0 评论 -
Android ION内存管理
ION是Android引入的一种避免内存碎片化的内存管理方式,用于分配连续或不连续内存。为了满足各种场景下的内存分配要求,ION引入了内存heap的概念.一个内存heap定义和实现了内存分配的方式或者用途. 1.内存heap1.1 heap类型enum ion_heap_type { ION_HEAP_TYPE_SYSTEM,//分配的物理页面不保证是连续的.类似于vmal...原创 2018-12-26 09:29:54 · 2132 阅读 · 0 评论 -
Android下的ashmem分析
主要分析匿名共享内存使用(ashmem)和实现原理未完待续........原创 2018-12-26 09:34:54 · 354 阅读 · 0 评论 -
Linux内核4.4打开kasan功能并替换内核编译器
基于高通820,Linux4.4内核使能kasan功能1. 打开宏定义CONFIG_KASAN=yCONFIG_KASAN_INLINE=y //GCC 5.0以上支持,主要优化执行效率CONFIG_KCOV=yCONFIG_TEST_KASAN=y//kasan 测试程序CONFIG_FRAME_WARN=02. bootimage分区和内核image大小调整...原创 2019-07-16 14:02:32 · 4128 阅读 · 1 评论 -
Linux mprotect来定位Linux踩内存的问题
这类问题一直没有很套路的方法解决,都需要走读大量的代码,做大量调试来解决。解这类问题最关键的两点就是,1,找到被踩的内存地址,2,抓住被踩的时序。 想要找到被踩的内存地址,这里很多时候可以通过堆栈反汇编,和调试,查找出来,虽然很多时候被踩的地方不固定,这就糟糕了。就要想方法发现共同规律,比如是否在同一个全局变量里面,或者都是同一个业务场景里面? 这里介绍一个好方法,如果知道了1...转载 2019-07-26 16:07:01 · 1204 阅读 · 0 评论 -
用slub track调试use after free问题
死机重启问题中,有部分是访问了已释放的内存导致,这就是典型的use after free问题.打开CONFIG_SLUB_DEBUG和CONFIG_SLUB_DEBUG_ON宏开关后,系统就可以监测内存的释放与分配调用栈.1. slab 内存布局slub的内存管理原理这里就不在详述.直接给出slabobject对象的内存布局,object内存包含下面四个部分:objec...原创 2016-11-01 11:04:27 · 2750 阅读 · 0 评论 -
Linux内存回收机制总结
1.当vma flag中标记VM_LOCKED时,表示这段内存不能被回收,要常驻内存中.2. 当ZONE的空闲页面数大于WMARK_HIGH时,这个ZONE就可认为是balanced(由函数zoen_balanced()判断)3. 当ZONE的水位低于WMARK_LOW时,触发内核启动内存回收,当ZONE的水位高于WMARK_LOW时,停止内存回收.4.Page相关标志位...原创 2018-11-16 16:24:18 · 1293 阅读 · 0 评论 -
内存泄露调试分析(二)
在monkey测试时,出现OOM情况,在OOM吐出的mem-info信息中slab SUnreclaim 并不多,只有300M左右。但是系统确没有可分配内存,后来通过回退版本,发现是WIFI firmware提交导致。继续跟踪slabinfo信息,发现skbuff_head_cache 一直在增加,查找skb的alloc_calls,发现WIFI驱动调用最多. 91376 __...原创 2018-04-09 18:59:20 · 1774 阅读 · 0 评论 -
Linux slub分配和释放分析
Slub内存分配器,是在slab的基础上,进一步优化而来,在内存管理,多处理并发访问上更有优势.这里主要讲解slub分配,释放,调试选项,以及针对slab的优化,源代码基于3.18.221. slub框架 slub是特定大小内存的集合(称为object),每个slub可以包含多个page,代码中用 struct kmem_cache, struct k...原创 2018-03-17 14:56:11 · 911 阅读 · 1 评论 -
Linux内核堆栈实现分析 save_stack_trace
1 内核线程Linux 内核为每个线程分配THREAD_SIZE(16k)的栈空间, 在每个堆栈的顶部放着struct thread_info 结构体,用来保存线程相关信息.其中有几个重要变量:Preempt_count :此变量分为四部分 0-7bit :当前进程是否能抢占的标志8-15bit:softirq 使能标志16-23bit :hardirq 使能标志...原创 2014-12-13 10:42:38 · 8677 阅读 · 0 评论 -
SLUB知识点记录
1. Linux内核释放内存以后,可能会把其值设置为0x6b#definePOISON_INUSE 0x5a/* for use-uninitialised poisoning */#define POISON_FREE 0x6b/* for use-after-free poisoning */#define POISON_END0xa5 /* end-byte of poisoning */2...原创 2018-03-19 19:09:31 · 958 阅读 · 0 评论 -
linux 内核 内存管理 slub算法 (一) 原理
内核管理页面使用了2个算法:伙伴算法和slub算法,伙伴算法以页为单位管理内存,但在大多数情况下,程序需要的并不是一整页,而是几个、几十个字节的小内存。于是需要另外一套系统来完成对小内存的管理,这就是slub系统。slub系统运行在伙伴系统之上,为内核提供小内存管理的功能。 slub把内存分组管理,每个组分别包含2^3、2^4、...2^11个字节,在4K页大小的默认情况下,另外还有...转载 2016-10-31 10:55:45 · 751 阅读 · 3 评论 -
内存泄露调试分析(一)
1.查看内存使用情况cat /proc/meminfo 其中SUnreclaim:695168 kB,随着测试时间加长SUnreclaim一直在增加,证明存在内存泄露可能.2.查看slab分配信息 cat /proc/slabinfo其中skbuff_head_cache和kmalloc-1024分配的object数量达到8万个以上,而且还在不断增加,怀疑skb有内存泄露.由于...原创 2018-03-17 14:25:39 · 6628 阅读 · 0 评论 -
Linux启动时的页表映射
内核启动时进行内存映射, map_mem()->create_mapping()内核支持4级映射(PGD->PUD->PMD->PTE) ,支持的level由宏CONFIG_PGTABLE_LEVELS定义,目前为3级映射,也即PGD->PMD->PTE从下图可以知道,每级页表分别使用虚拟地址的9位作为索引,也即每级页表大小为512. 虚拟地址最后12...转载 2018-03-28 14:49:33 · 2675 阅读 · 0 评论 -
Linux arm64的虚拟内存布局
页表转换arm64在硬件体系结构上支持4级的每页大小为4K的页表转换,也支持3级的页大小64KB的页表转换。在linux arm64中,如果页的大小为4KB,使用3级页表转换或者4级页表转换,用户空间和内核空间都支持有39bit(512GB)或者48bit(256TB)大小的虚拟地址空间。如果页的大小为64KB,就只有2级页表转换,支持42bit(4TB)大小的虚拟地址,用户空间和内核空间也...转载 2018-03-28 14:49:42 · 2489 阅读 · 0 评论 -
Linux内存模型
一、前言在linux内核中支持3中内存模型,分别是flat memory model,Discontiguous memory model和sparse memory model。所谓memory model,其实就是从cpu的角度看,其物理内存的分布情况,在linux kernel中,使用什么的方式来管理这些物理内存。另外,需要说明的是:本文主要focus在share memory的系统,也就是...转载 2018-03-28 14:49:52 · 604 阅读 · 0 评论 -
memblock初始化
在伙伴系统和slab初始化完成之前,系统启动时,通过memblock模块来分配和管理内存.memblock提供的主要接口: memblock_add(phys_addr_t base, phys_addr_t size):向memory区中添加内存区域. memblock_remove(phys_addr_t base, phys_addr_t size):向memory区中删...原创 2018-03-28 16:38:29 · 1180 阅读 · 0 评论 -
CMA内存分配
在以前的驱动中,一般给LCD/GPU/camera预留部分内存,满足这些模块内存分配的同时,也能够提供物理地址连续内存.但是,如果GPU/camera/LCD没有使用时,这部分内存就白白浪费了,所以就有了CMA机制. CMA给驱动提供了一种分配连续内存的方法, 在驱动没有分配CMA内存时,这部分内存可以用于migrate type为moveable的内存分配,在驱动需要CMA内存时,...原创 2018-04-04 11:01:28 · 3186 阅读 · 0 评论 -
Linux内存管理之vmalloc实现
vmalloc最小分配一个page.并且分配到的页面不保证是连续的.因为vmalloc内部调用alloc_page多次分配单个页面.vmalloc主要内容:1. 从VMALLOC_START到VMALLOC_END查找空闲的虚拟地址空间(hole)2.根据分配的size,调用alloc_page依次分配单个页面.3. 把分配的单个页面,映射到第一步中找到的连续的虚拟地址。 ...原创 2018-10-25 17:19:18 · 777 阅读 · 0 评论 -
Linux内存管理之反向映射RMAP
1. Linux反向映射有三个常用数据结构,可以简称AV, VMA,AVCstruct anon_vma { struct anon_vma *root;//指向红黑树最顶层AV,可以理解为祖宗进程的AV unsigned degree;//树深度,表示是第几代进程,也可以理解为在红黑树的层级 struct anon_vma *parent; //指向父进程AV...原创 2018-11-14 17:11:22 · 1556 阅读 · 0 评论 -
Linux缺页异常处理
1.如果访问的虚拟地址在进程空间没有对应的VMA(mmap和malloc可以分配vma),则缺页处理失败,程序出现段错误.2.Linux把没有映射到文件的映射叫做匿名映射(malloc和mmap的匿名映射)。3.remap_pfn_range把内核内存映射到用户空间,一般在设备驱动的mmap函数中调用.int remap_pfn_range(struct vm_area_struct ...原创 2018-11-01 14:32:47 · 1853 阅读 · 0 评论 -
gfp_mask转换成对应的zone和migratetype
1.node的转换在分配内存时,都会带分配参数比如GPF_KERNEL等等,那么,一次内存分配从哪个zone分配了?这里就必需把mask转换成zone,gfp_mask低4位用于表示分配的zonestatic inline enum zone_type gfp_zone(gfp_t flags){ enum zone_type z; int bit = (__forc...原创 2018-10-24 18:56:19 · 2039 阅读 · 0 评论 -
Linux mmap原理
进程用mmap来分配内存,读取大文件,进程间通讯等void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset)当创建共享的匿名映射时,内核会打开dev/zero结点,把共享匿名映射到文件。也就是只有私有的匿名映射没有关联到文件(单纯的内存分配) ...转载 2018-10-31 17:46:56 · 218 阅读 · 0 评论 -
Linux伙伴系统原理-内存分配和释放
主要分析Linux伙伴系统算法,内存的分配和释放1.伙伴系统简介 Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生,Linux采用伙伴系统解决外部碎片的问题,采用slab解决内 部碎片的问题.伙伴算法(Buddy system)把所有的空闲页框分为11个块链表,每块链表中分布包含特定的连续页框地址空间,比如第0个块链表包含大小为2^0个...原创 2018-10-24 16:44:01 · 2304 阅读 · 0 评论 -
Linux内存初始化之伙伴系统(三)
这里主要分析zone/zonelist的初始化,以及把系统空闲内存释放到伙伴系统1.zone的初始化调用关系:start_kernel->setup_arch->paging_init->bootmem_init->zone_sizes_init->free_area_init_node->free_area_init_core->zone_s...原创 2018-10-24 15:59:58 · 941 阅读 · 0 评论 -
Linux内存初始化之sparse内存模型(二)
1.Linux内存模型前面已经分析把物理内存添加到memblock以及给物理内存建立页表映射,这里我们分析sparse内存模型在linux内核中支持3中内存模型,分别是flat memory model,Discontiguous memory model和sparse memory model。所谓memory model,其实就是从cpu的角度看,其物理内存的分布情况,在linux k...原创 2018-10-24 14:21:21 · 2720 阅读 · 0 评论