自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(79)

原创 Android通过命令启动APP的方法

1.首先手动启动APP,然后执行命令“adb shell dumpsys window | findstr mCurrentFocus”获取当前APP的activity2. 执行命令adb shell am start-activity -S -W + "package name/activity name"例如启动settings:adb shell am start-activit...

2019-06-13 19:59:25 1973

原创 kernel-4.9内存回收核心流程

以32位系统为例内存分配流程调用流程:alloc_pages()-->alloc_pages_node() -->__alloc_pages_node() -->__alloc_pages() -->__alloc_pages_nodemask() -->get_page_from_freelist()在get_pa...

2019-04-14 17:55:36 962

转载 #pragma once与 #ifndef的区别

为了避免同一个文件被include多次1#ifndef方式2#pragma once方式在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 一些声明语句 #endif...

2019-04-09 23:46:04 69

原创 cgroup之memory cgroup(二)

memory cgroup起作用主要是限制各个进程使用内存大小,当其值超越限制值时会发生oom,讲当前进程清理掉。memcg oom的主要运行流程如下:首先进程在申请内存时会进行try_charge操作,此时会进行oom检测,如果是oom,则会把当前的memcg赋值给进程的memcg_in_oom成员,然后在缺页中断中会对当前进程是否存在oom进行判断,如果是,则发送oom events事...

2019-04-09 17:05:53 1219 2

原创 cgroup之 memory cgroup(一)

如前文所述,memcg的整体框架如下:对于memcg,作为一个cgroup的subsystem,它遵循hierarchy的所有规则,另外,对于hierarchy中cgroup的层级对memcg管理规则的影响,主要分两方面:1、 如果不启用hierarchy,即mem_cgroup->use_hierarchy =false,则所有的memcg之间都是互相独立,互不影响的,即使是父...

2019-04-09 15:36:42 849

原创 Android中cgroup文件系统的mount流程

我们知道Android起来之后cgroup的各个子系统的文件夹都放在dev目录下,例如:/dev/memcg//dev/cpuctrl//dev/cpuset//dev/acct//dev/blkio/以上这些文件夹都是在初始化时候在init.rc中进行mount的,代码目录位于/system/core/rootdir/init.rc其mount最后通过syscall进...

2019-04-08 22:43:10 423

原创 Linux cgroup的整体框架

最近因为项目原因,发现对于cgroup的知识严重匮乏,所以恶补了一下cgroup的相关知识。cgroup指对进程进行分组,然后控制让他们的cpu,io以及memory的使用,和系统的性能息息相关。一、首先是cgroup的整体框架图:以上框图可以看出以下几点:1. cgroup的subsys分为很多种,主要有:acct:进行CPU资源的统计cpuset:主要用来色值进程跑...

2019-04-08 18:39:11 805

原创 内存回收中fastpath和kswapd以及direct reclaim的差异

fastpath、kswapd和direct reclaim都会扫描zone,且最后调用的函数都一样,那么他们有什么区别呢?fastpath和slowpath的区别在于,fastpath要求zone的unmapped file page必须大于zone规定的min_unmapped_pages,slab reclaimable大于min_slab_pages,回收内存的的页数为2^order个...

2018-12-26 21:00:33 1378

原创 内存回收的关键函数以及其功能

zone_wartermark_ok()主要用来判断当前zone的free pages个数是否大于参数的watermark的值,且当前zone存在连续的内存块满足内存分配时的2^order个页数,order为函数参数指定。balance_pgdat():函数会先通过zone_balanced()从高到低来查找第一个不平衡的zone,然后判断是否需要进行内存规整,最后zone号从低到高通过ksw...

2018-12-18 23:01:36 250

转载 Binder驱动介绍

看到一篇不错的关于binder驱动介绍的文章,转载一下,原文链接:https://www.jianshu.com/p/b826cbf3cb8dBinder驱动是Android专用的一个驱动程序,保持了和一般Linux驱动一样框架。Binder驱动不涉及任何外设,本质上只操作内存,负责将数据从一个进程传递到另外一个进程。Binder驱动的代码存放在如下几个目录:kernel/drive...

2018-11-27 21:40:56 185

转载 schedule_timeout

fastcall signed long __sched schedule_timeout(signed long timeout){    struct timer_list timer;    unsigned long expire;    switch (timeout)    {    case MAX_SCHEDULE_TIMEOUT:        schedule(...

2018-09-26 14:32:57 409

转载 page的几个比较中重要的flag

_count:表示内核引用该页面的次数,当_count为0时表示该页面为空闲或者即将被释放,当count大于0时表示该页面正在被使用,暂时不会被释放。_mapcount:表示该页面被进程映射的个数,即已经映射了多少个pte页表。_mapcount为-1表示没有pte映射页面中去,_mapcount为0表示只有父进程映射了该页面。PG_active:表示该页面为活跃页面,PG_referen...

2018-09-11 20:31:22 218

原创 RMAP反向映射

看了一下关于RMAP的东西,感觉看的云里雾里,现在简单总结下RMAP的作用:产生背景:我们知道一个page可以被多个进程的多个虚拟地址映射到,但是如果需要从page找到所有映射这个page的虚拟地址需要同时访问系统当前所有进程的进程空间的VMA,从中去寻找是否有虚拟地址映射到了此页面,对于系统来说,这是一个非常繁重的工作,所以这里需要一种可以从page快速找到所有映射了此页面的VMA,这种...

2018-09-07 17:06:04 696

转载 DDR3 内存带宽计算

内存带宽计算公式:带宽=内存核心频率×内存总线位数×倍增系数。     先容我从DDR的技术说起,DDR采用时钟脉冲上升、下降沿各传一次数据,1个时钟信号可以传输2倍于SDRAM的数据,所以又称为双倍速率SDRAM。它的倍增系数就是2。    DDR2仍然采用时钟脉冲上升、下降支各传一次数据的技术(不是传2次),但是一次预读4bit数据,是DDR一次预读2bit的2倍,因此,它的倍增系数是...

2018-09-07 15:05:12 4488

原创 do_swap_page函数

前面已经讲过,当pte所对应的page不在内存中,且pte对应的内容不为0时,表示此时pte的内容所对应的页面在swap空间中,缺页异常时会通过do_swap_page()函数来分配页面:static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, pte_...

2018-09-06 01:44:16 1121

转载 缺页异常的几种情况处理机制简介

匿名页面:do_anonymous_page():static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, pte_t *page_table, pmd_t *pmd, unsigned int flags){……………… if ...

2018-09-05 23:18:36 2239

转载 页面锁

lock_page 可以占用这个页面,这样其他进程要使用这个页时只能在睡眠中等待static inline void lock_page(struct page *page){ #这里提示在使用lock_page这个函数时会等待 might_sleep(); #检查是否可以锁定这个page.如果没有其他进程用这个page,则直接设置flag来锁定这个page,否则调用__lock_pa...

2018-09-05 18:41:37 474

转载 线程被IO卡住的原因之一

在内存trace中经常遇到线程uninterruptable sleep,而打出来的trace可以看到是如下:wait_on_page_bit_killable+0xb0/0xcc__lock_page_or_retry+0xb8/0xf4filemap_fault+0x4cc/0x630ext4_filemap_fault+0x34/0x48__do_fault+0x88/0x110...

2018-09-05 17:45:51 5406

转载 缺页异常详解

首先明确下什么是缺页异常,CPU通过地址总线可以访问连接在地址总线上的所有外设,包括物理内存、IO设备等等,但从CPU发出的访问地址并非是这些外设在地址总线上的物理地址,而是一个虚拟地址,由MMU将虚拟地址转换成物理地址再从地址总线上发出,MMU上的这种虚拟地址和物理地址的转换关系是需要创建的,并且MMU还可以设置这个物理页是否可以进行写操作,当没有创建一个虚拟地址到物理地址的映射,或者创建了这样...

2018-09-04 20:22:20 327

原创 handle_mm_fault执行流程

__handle_mm_fault()handle_pte_fault()

2018-09-04 15:23:36 921

原创 do_page_fault()执行流程

2018-09-03 16:38:57 4161

转载 Android OOM killer机制

Linux下有一种OOM KILLER 的机制,它会在系统内存耗尽的情况下,启用自己算法有选择性的kill 掉一些进程。  1. 为什么会有OOM killer  当我们使用应用时,需要申请内存,即进行malloc的操作,进行malloc操作如果返回一个非NULL的操作表示申请到了可用的内存。事实上,这个地方是可能存在bug的。Linux有一种内存优化机制,即:允许程序申请比系统可用内存更多的...

2018-08-30 14:25:43 449

原创 几个内存分配API的区别

内存分配的API有:alloc_pages, kmalloc, slab分配,vmalloc, malloc,下面简单说明一下以上几个函数的差别:alloc_pages:主要用来从buddy系统中分配内存,以页为单位分配区域需要通过gfp_flag指定,一般情况下会优先从highmem zone分配,返回的是分配到物理首个页面的管理结构体struct page,buddy里面页面的组织情况如下...

2018-08-29 01:30:17 1418

原创 进程地址空间VMA以及malloc

进程空间的VMA结构体中由两个成员,红黑树以及链表,表示其组织方式由两种:红黑树: 链表类型:有了上面的图例,下面简单讲一下malloc的分配原理:首先malloc是通过系统调用brk来完成内存分配的:SYSCALL_DEFINE1(brk, unsigned long, brk)------------(1){ unsigned long retval; ...

2018-08-29 00:43:19 1381

转载 ARM32 进程的virtual memory布局图

ps:上图最右边的start_code, end_code, start_data, end_data……表示进程描述符中mm_struct结构体对应成员所代表的意思。

2018-08-28 00:39:35 305

原创 list_entry通俗理解方法

大家都知道list_entry时kernel里面经常遇到的一个函数,其定义为:#define list_entry(ptr, type, member) \ container_of(ptr, type, member)#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member...

2018-08-20 00:06:35 10807

原创 vmalloc

前面说到kmalloc时基于slab分配器来实现的,其分配的物理内存时连续的,但是kmalloc一次分配的内存不能太大,现在说vmalloc,vmalloc分配的虚拟内存时连续的,其分配的区间为内存初始化时分配的从VMALLOC_START到VMALLOC_END区间,分配的虚拟内存时以PAGE_SIZE对齐的:void *vmalloc(unsigned long size){ ret...

2018-08-12 21:33:49 2205

原创 kernel-4.4 slab(三)

前面已经讲了slab描述符的初始化以及slab对象的创建,下面是slab对象的回收:slab对象的回收通过kmem_cache_free来完成:void kmem_cache_free(struct kmem_cache *cachep, void *objp){ unsigned long flags; cachep = cache_from_obj(cachep, objp);...

2018-08-08 23:02:02 129

原创 kernel-4.4 slab(二)

slab对象的分配:slab对象的分配使用kmem_cache_alloc():void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags){ void *ret = slab_alloc(cachep, flags, _RET_IP_); trace_kmem_cache_alloc(_RET_IP_, ret,...

2018-08-08 19:25:27 108

原创 kernel-4.4 slab(一)

linux slab作为用于小块内存分配的机制,主要用于低于PAGE SIZE大小内存的分配,是相对于page_alloc用于分配以页为单位的内存来说的。slab机制主要分为slab描述符的创建,slab对象的分配,slab对象的回收。1. slab的创建:先看slab描述符:struct kmem_cache { struct array_cache __percpu *cp...

2018-08-08 01:47:34 267

原创 __zone_watermark_ok函数执行流程

 

2018-07-25 23:52:56 310

原创 内存映射图

我理解的ARM64虚拟地址到物理地址的映射关系:其中在PTE table addr+PTE栏中不仅包含pfn,还包含page的一些属性

2018-07-23 18:06:22 684

原创 android里面kernel-4.4和kernel4.9中关于memory zone watermark计算方法的变动

今天看到一个有趣的地方就是在计算memory zone的watermark值的变化:在kernel-4.4中:static void __setup_per_zone_wmarks(void){ unsigned long pages_min = min_free_kbytes >> (PAGE_SHIFT - 10);------------(1) unsigned ...

2018-07-19 00:36:16 790

转载 ARM64页表映射过程

参考wowotech关于此topic的讲解:http://www.wowotech.net/memory_management/mem_init_3.html内存初始化代码分析(三):创建系统内存地址映射作者:linuxer 发布于:2016-11-24 12:08 分类:内存管理一、前言经过内存初始化代码分析(一)和内存初始化代码分析(二)的过渡,我们终于来到了内存初始化的核...

2018-07-17 23:44:38 1489

原创 arm32页表映射过程(二)

map_lowmem()建立低端内存的结束地址一一映射(虚拟地址和物理地址只差一个偏移)关系:static void __init map_lowmem(void){ struct memblock_region *reg; phys_addr_t kernel_x_start = round_down(__pa(_stext), SECTION_SIZE); phys_addr_t...

2018-07-16 21:37:08 632

原创 arm32页表映射过程(一)

在完成前面memory size的初始化之后,下面就是页表的映射了,具体过程如下:start_kernel()->setup_arch()->paging_init()void __init paging_init(const struct machine_desc *mdesc){ void *zero_page; build_mem_type_table();-------...

2018-07-11 01:37:17 1070

原创 Linux memory的初始化(三)

在阅读玩memory初始化的大部分代码之后,突然发现一个问题:在log中发现memory type的遍历过程中发现memory type cnt的值从之前初始化的一个变成了7个,但是搜遍所有的代码也没有发现具体在哪里初始化的这个值,也就是说在reserve type region增加的过程中如何做到memory type region也同时增加的呢?将初始化的代码又撸过一遍之后终于在reserve...

2018-06-29 02:02:34 864

原创 Linux memory的初始化(二)

今天接着讲memory的初始化函数arm_memblock_init,在上面完成了memory size的初始化,将整个memory添加以memory type的方式添加到了memory block中,下面是memory reserve部分的初始化,其初始化流程如下:arm_memblock_init->early_init_fdt_scan_reserved_mem->of_scan...

2018-06-28 01:22:29 1315

原创 Linux memory的初始化(一)

前面已经通过转载的方式介绍了Linux的设备树,现在来讲讲内存大小的初始化:kernel内存大小的初始化函数调用顺序如下:start_kernel->setup_arch->setup_machine_fdt->early_init_dt_scan_nodes->early_init_dt_scan_chosen->early_init_dt_scan_root-&g...

2018-06-27 00:37:32 1534

原创 android recentlist里面关于memory数值的解释

我们在点开recent list里面经常会看到有一行关于memory使用的记录:450MB/1GB这里的450MB为当前系统已用的内存,而1GB则表示总内存大小。其代码如下:1172 public void calculateRamText(){1173 ActivityManager mActivityManager = (ActivityManager) mConte...

2018-06-26 16:24:06 236

空空如也

空空如也

空空如也
提示
确定要删除当前文章?
取消 删除