自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

私房菜

探索是一种乐趣,总结是一种习惯,坚持就是人生!

  • 博客(540)
  • 资源 (6)
  • 收藏
  • 关注

原创 Linux 内存管理全面剖析

还是习惯性的以前言开篇,“深入骨髓”的程序猿思想,干啥事都想从main 开始~~在Android 项目中接触内存管理相关的有一段时间了,中间看了很多代码,看了忘,忘了看,反反复复,索性就抽点时间整理出来~~该专栏通过剖析 Linux 5.4 版本的源码,尽可能清晰、完整地总结内存管理相关的知识点,进而展示Linux 内存管理的所有模块的原理。该专栏中的原理会在持续、长期、反复地的剖析中进行补充说明。

2023-05-26 09:52:19 1291

原创 Android 中ebpf 的集成和调试

在 2013 年,Alexei Starovoitov 对 BPF 进行彻底地改造,这个新版本被命名为eBPF(extended BPF),与此同时,将以前的 BPF 变成 cBPF (classic BPF)。新版本出现了如映射和尾调用 (tail call)这样的新特性,并且 JIT 编译器也被重写了。新的语言比 cBPF 更接近于原生机器语言。并且,在内核中创建了新的附着点。bpf(2)

2024-08-27 22:09:20 1131

原创 Linux 中的同步机制——rwsem

读写信号量的原理与读写锁类似,读写信号量归根到底是“信号量”,读写锁归根到底是“自旋锁”,而信号量与自旋锁的区别一个可以睡眠,一个只能自旋。允许多个读者同时进入临界区;读者与写者不能同时进入临界区(读者与写者互斥);写者与写者不能同时进入临界区(写者与写者互斥);

2024-08-15 21:59:07 767

原创 Linux 中的同步机制

指哪些在同一时刻只允许被一个线程访问的软件或硬件资源。这种资源的特点是,如果有线程正在使用,其他进程必须等待直到该线程释放资源。指在每个线程中访问临界资源的那段代码。由于临界资源需要互斥访问,因此每个线程的临界区代码在执行时需要确保没有其他现成同事访问该资源。

2024-08-13 09:48:00 889

原创 Android 埋点信息分析——内存篇

在前一篇《Android statsd 埋点简析》一文中简单剖析了Android 埋点采集、传输的框架,本文在其基础对埋点信息进行解析,来看下Android 中埋下的内存信息有哪些。

2024-08-06 09:42:16 989

原创 Android dex2oat 编译线程简析

名称说明要求 post_bootcomplete 为false要求 for_restore 为 true,备份prop 为 dalvik.vm.dex2oat-threads要求 background_job_compile,备份prop 为 dalvik.vm.dex2oat-threads通常作为备份的prop,上述prop 没有配置时,会使用这个备份prop。

2024-07-26 18:12:08 481

原创 Android 埋点信息分析——statsd框架

StatsPullAtomService 用以采集数据,并将数据填充到参数中,在StatsManager.PullAtomCallbackInternal 中会转换成 Parcel 格式传入到 native。StatsCallbackPuller::PullInternal 中会回调StatsManager.PullAtomCallbackInternal 的onPullAtom,该函数中会回调StatsCallbackPuller::PullInternal 中定义的PullResultRecei

2024-07-26 11:37:18 506

原创 记:我在 CSDN 的4096天

我也是在这些巨人的影响下,一点一滴地分享着自己的 “所见所闻”,从最开始学习优秀博主的创作风格,到现在形成自己的创作流程;,他们毫不吝啬地将自己所了解的最新讯息、最前言的技术、最完整的分析过程都毫无保留地分享给读者,让后来的小伙伴们能在巨人的肩膀上继续耕耘在自己的一份土地上。5. 别真的傻站着等被裁员,你没工作的时候,很痛苦,所以,知道要干嘛吗?4. 被裁员了,别抱怨,是你自己没那实力,所以,知道要干嘛吗?天的创作,也是自己留给自己的人生轨迹中弥足珍贵的回忆。3. 还没退休呢,继续努力吧,中年;

2024-07-15 10:38:31 392

原创 Linux内存管理(七十五):memcg v1 简介

全局 LRU 会swap out 任意的页数,swap out 意味着内存搬移到swap,对于memory +swap 是没有变化的。也就是说,当我们想限制swap 使用而没有影响全局 LRU,-站在操作系统的角度,限制 memory+swap 要比限制swap 好。

2024-06-28 10:13:08 497

原创 Linux内存管理(七十四):memcg v2 简介

memory.swap.high与max 略微不同,当cgroup 的swap使用量达到该 limit,将对cgroup 的分配进行节流,以允许用户空间实现自定义内存不足的过程。如果cgroup的内存使用量在该值下限内,则该cgroup 的内存将不会被回收,除非不受保护的cgroup中没有可用的可回收内存。如果在该 cgroup 中调用OOM killer,则无论其祖先 cgroup的 memory.oom.group为何值,都不会kill 该cgroup 以外的任何tasks。

2024-06-27 15:48:05 526

原创 Linux内存管理(七十三):cgroup v2 简介

术语:cgroup:control group 的缩写,永不大写(never capitalized);单数形式的 cgroup 用于指定整个特性,也用作等术语中的修饰符;复数形式的 cgroups 显式指多个独立的;cgroup 是一种机制,它将系统进程按照分层组织,并沿着这种分层以一个可控、可配置的方式来分配系统资源。

2024-06-27 10:17:23 191

原创 Virtualbox 安装 ubuntu + qemu

关于 Virualbox 安装虚拟机的优秀文章太多了,笔者主要是着重梳理一些安装小细节,利己利人!!如果需要保姆式的安装教程,可以查看后续的参考链接。

2024-06-04 10:44:28 1160 1

原创 Linux内存管理(七十二):Linux PSI 原理更新(v5.15)

本文是在之前《PSI 详解 v5.4》一文基础上,整理一下PSI 原理中的细节,包含 cgroup v2 关于PSI 的原理和使用。PSI 详解 v5.4PSI 指标PSI 功能依赖CONFIG_PSI,当该 config 没有使能,psi.c是不会被编译到 image的。

2024-05-29 19:00:15 967

原创 设置线程 CPU 亲和性的几种方式

线程CPU 亲和性分两种:软亲和性和硬亲和性。软亲和性主要由操作系统来实现,Linux 操作系统的调度器会倾向于保持一个进程不会频繁在多个 CPU 之间迁移,通常情况下调度器都会根据各个 CPU 的负载情况合理地调度运行中的进程,以减轻繁忙 CPU 的压力,提高所有进程整体性能。硬亲和性由用户调用系统 API 实现自定义进程运行在指定的 CPU 上,从而满足特定进程的特殊性能需求。

2024-05-21 22:06:53 1579

原创 dumsys meminfo 细节之GPU memory

从前文中得知,无论是 getMemoryInfo() 还是 getPss() 函数,都会调用函数收集 graphics 的内存。这其中涉及dmabuf 等相关信息,本文将单独剖析GPU memory 的统计过程。

2024-05-21 10:47:46 1189

原创 Android ART 虚拟机简析

用来执行显示GC,例如 system.gc() 接口;,用来执行并行GC,只能被 ART 运行时内部的GC 守护线程调用;,ART运行时内部调用的GC 接口,可以执行各种类型的GC;ART runtime 将空间划分:Image Space、Malloc Space、Zygote Space、Bump Pointer Space、Region Space、Large Object Space。

2024-05-20 13:52:35 1067

原创 Android ashmem 原理分析

ashmem称为匿名共享内存(Anonymous),它以驱动程序的形式实现在内核空间中。它有两个特点:能否辅助内存管理系统来有效地管理不再使用的内存块(pin / unpin);通过Binder进程间通信机制来实现内存共享;虽然 Binder机制已经可以实现了跨进程的高效通信,但是Binder 通信所允许的数据是有限制的(如下代码),如果需要大量数据交互就有限制了。

2024-05-11 16:33:46 1306 2

原创 dumpsys meminfo 流程中细节

另外,当该 flag 为true时,dump 流程会调用 thread.dumpMemInfo() 函数,会通过 getRuntime() 获取app 进程dalvik 的 totalMemory 和 freeMemory,并计算出 dalvikAllocated,得到app 进程虚拟机内存使用情况。无论 getMemoryInfo() 之后在 AMS 中计算,还是getPss() 在 android_os_Debug.cpp 中计算,total 的pss,都是需要加上 swap out pss;

2024-05-06 16:51:39 1057 2

原创 dumpsys meminfo 详解(U)

不同的版本 meminfo 的统计还是出现了少许的变化,本文继《meminfo 详解 R版本》一文,进一步补充U 版本的dumpsys meminfo 的统计流程。

2024-05-06 10:23:36 1321

原创 Linux 内核 delayacct 原理分析

用以统计此次 swapin 的耗时,当成功获得IO 资源后,此次 IO 耗时会被统计到 swapin_delay 里,而不被统计到 blkio_delay。即 blkio_delay 统计的是非swapin 的IO 耗时,而 swapin_delay 统计的是 swapin 的 IO 耗时。在内存紧张时会进行内存回收,最终会调用到 do_try_to_free_pages() 函数,这里会统计整个回收过程所产生的耗时(调用 shrink_zones 函数)。中会检测 task_struct 中。

2024-04-28 12:00:00 1223

原创 Linux 内核复合页(compound page)原理分析

复合页() 只是将两个或更多物理上连续的页面组合成一个单元,在许多方面可以将其视为单个更大的页面。它们最常用于创建大页面,在hugetlbfs或透明大页(transparent huge pages)子系统中使用,但它们也出现在其他场景中。复合页可以用作匿名内存或用作内核中的buffers;但是,它们不能出现在page cache中,page cache只能处理单个页面。分配复合页面是调用 alloc_pages() 并设置__GFP_COMP分配标志和页帧数大于1, 即order至少为1。

2024-04-15 17:50:43 1165

转载 Linux下/proc目录简介

在linux的根目录下存在一个/proc目录,/proc文件系统是一种虚拟文件系统,以文件系统目录和文件形式,提供一个指向内核数据结构的接口,通过它能够查看和改变各种系统属性.proc目录通常情况下是由系统自动挂载在/proc目录下,但是我们也可以自行手动挂载./proc目录下的大部分文件都是只读的,部分文件是可写的,我们通过这些可写的文件来修改内核的一些配置;/proc目录下还有许多目录,但是本文并没有介绍,主要原因是这些信息在平时查询或者使用都比较少,所以没有介绍.如果有兴趣,可以自行阅读proc手册。

2024-04-09 09:33:45 1552

原创 Linux内存管理(二十五):buddy 分配器之rmqueue

经过zone_watermark_fast() 函数进行水位判断,如果无法达到水位要求,会尝试第7、8 两节的流程,但如果第7、8 两节的逻辑都无法满足,那只能跳到下一个 zone 进行分配。当水位检测通过时,或者此次分配不用关注水位时,会接着调用 rmqueue() 函数,这里是内存分配的核心处理函数:

2024-02-04 10:42:38 182

原创 Linux内存管理(四十二):CMA 分配器——分配原理

上一篇博文是延续《memblock初始化》一文,对 dts 中 reserved-memory 节点进行详细剖析,阐述 CMA 分配器中核心数组 cma_areas 的创建过程。本文将重点剖析 CMA 分配器的分配、释放流程,对应接口是 cma_alloc() 函数、cma_release() 函数。将 cma 分配过程通过 5 张图阐述总结,核心逻辑都在图1,此时 CMA 的内存正在被非 cma 驱动使用,其中绿色表示普通页面,紫色表示干净的文件页,此时内存还是 MIGRATE_CMA 类型;图2,

2024-01-08 16:42:14 1089

原创 ramdump 中的memory统计

ramdump是指某个时刻系统或者子系统发生crash等异常,系统将内存中的数据通过一定的方式保存下来,相当于一个系统内存快照,用以开发者离线分析系统异常问题。

2023-12-30 10:32:57 843

原创 OH中的 sanitizer 详解

相对于Android中的Asan 和 HWAsan,鸿蒙中也配套有 sanitizer 用于内存异常检测。

2023-12-28 18:06:49 5349

原创 Linux 内核参数:vmallocinfo

内存管理是一个相对复杂的内核模块,错综复杂的数据结构和管理逻辑。Linux 内核为了帮助开发者从宏观上把握内存的使用情况,在几大核心数据结构中都有相应的计数统计,如物理页面使用情况、伙伴系统分配情况、内存管理区的页面使用情况、内存回收扫描回收情况、内存规整触发情况等等。在《vmalloc 详解》一文中详细地剖析了vmalloc 的分配、释放流程,系统提供了 /proc/vmallocinfo 节点来查看在vmalloc 区域中分配的内存详细信息。

2023-12-20 16:22:45 1074

原创 Linux内存管理(十七):percpu 分配器——初始化

上一篇博文我们剖析了 percpu 分配器基本概念,包括percpup 的静态变量的声明、定义、访问,也包括 percpu 动态变量的声明、定义、访问,并详细地总结了 percpu 分配器中的几个重要数据结构以及含义、原理。另外,我们得知内核初始化在 setup_arch()初始化完成后,会返回 start_kernel() 进行进一步的初始化,percpu 分配器初始化刻不容缓的通过调用函数完成。因为percpu 分配器初始化的流程内容太多,本文将其中核心函数单独抽出来剖析。

2023-12-18 15:24:08 859

原创 Linux 中的 waitqueue 机制详解

等待队列这个机制在Linux 内核中使用的频率很高,与进程调度机制紧密相关联,可以用来同步对系统资源的访问、异步事件通知、跨进程通信等。网上关于等待队列使用的优秀文章也很多,之所以笔者也写一篇,一是想更新下最新代码中的使用,二是融入些自己的拙见,方便自己回头查看,也希望能有助于后来读者。

2023-12-14 20:20:57 1695

原创 Linux 中的 container_of 原理

这个宏函数在Linux 内核中使用的频率还是很多的。网上关于 container_of 使用的优秀文章也很多,之所以笔者也写一篇,一是想更新下最新代码中的使用,二是融入些自己的鄙见,方便自己回头查看,也希望能有助于后来读者。

2023-12-13 15:51:56 1032

原创 Linux内存管理(十八):percpu 分配器——动态分配

上一篇博文我们剖析了 percpu 机制的整个框架,包括percpu 中每个 cpu unit 的管理、内存区间的分配、静态percpu 变量的访问、reserved chunk和first chunk 的创建等流程。

2023-12-11 14:15:50 1166

原创 Linux scatterlist 详解

之前在《Linux DMA... 零拷贝》博文分享了DMA 技术和零拷贝技术,在进行I/O设备和内存的数据传输的时候,数据搬运的工作全部交给DMA 控制器,而CPU 不再参与任何与数据搬运相关的事情,这样CPU就可以去处理别的事务。用户层与外设或子系统可能需要大量数据交互,这样就需要大量的内存,而随着系统的长时间运行,物理内存可能存在大量的碎片,想要申请很大的一块物理内存已经成为奢望。并且,从性能方面考虑,用户层和子系统都希望减少交互的次数,更希望一次性将数据都交给 DMA控制器搬运。

2023-11-30 16:25:50 2611

原创 Linux内存管理(四十六):ION 内存管理器——system heap

ION是 Google 在 Android 4.0 中引入,目的主要是通过在硬件设备和用户空间之间分配和共享内存,实现设备之间零拷贝共享内存,多用于多媒体,比如 camera、display、graphic等。ION是一个内存管理器,管理不同type的内存堆(heap),而不同的type的内存又通过不同的内存分配器来分配,比如cma、kmalloc、vmalloc等。通过《ION 总篇》

2023-11-28 21:50:29 1422

原创 Linux内存管理(四十五):ION 内存管理器——cma heap

ION是 Google 在 Android 4.0 中引入,目的主要是通过在硬件设备和用户空间之间分配和共享内存,实现设备之间零拷贝共享内存,多用于多媒体,比如 camera、display、graphic等。ION是一个内存管理器,管理不同type的内存堆(heap),而不同的type的内存又通过不同的内存分配器来分配,比如cma、kmalloc、vmalloc等。通过《ION 总篇》

2023-11-28 21:45:44 1231

原创 Linux内存管理(十六):percpu 分配器——基本原理

随着 SMP(对称多处理器架构)的发展,在享受处理器更快的执行效率的同时,也为数据同步带来了更大的挑战,因为在 SMP 架构中,程序确实是在并发执行,从单 CPU 只需要考虑调度风险,到SMP 中还需要考虑多 CPU 中同时执行的风险,而且在单 CPU 下乱序执行也会在 SMP 架构中带来,从而也衍生了一些新的同步机制,例如:内存屏障、percpu 机制等等。

2023-11-10 19:31:46 489

原创 GNU链接脚本详解

每一个链接都是由链接脚本控制的,链接脚本是用链接命令语言编写的脚本。链接都会用到一个链接脚本,如果你没有指定自己的脚本,就会使用默认的链接脚本。可以用 "--verbose" 命令行选项显示默认的连接脚本。指定命令行参数,比如 '-r'、'-N'都会影响默认的链接脚本。也可以用 '-T' 来指定自己的链接脚本,也可以隐式地把自己的连接脚本当成链接输入文件,就像普通的链接文件一样,参见链接文件说明。如上图,链接器是将多个对象文件链接成可执行程序。链接器输入文件:目标文件或链接脚本文件;

2023-11-07 17:09:11 1105

原创 Linux 内核链接脚本vmlinux.lds.S详解

现代软件工程中,一个大的工程通常都会有多个源文件组成,其中包括高级计算机语言编写的源文件,以及汇编语言编写的汇编文件。在编译构建过程中会分别对这些源文件进行汇编、编译生成目标文件,这些目标文件包含:代码段、数据段、符号表等内容。链接器主要任务是将符号引用解析到符号定义上,将多个目标文件和库文件合并成为一个可执行文件或者动态链接库,生成符号表,并对程序代码做最后的检查和优化。本文主要针对 ARM64架构的连接脚本进行剖析。因为 vmlinux.lds.S 的内容比较多,本文将其拆分后分析。

2023-11-03 20:50:45 1503

原创 Linux 中的 initcall 机制详解

Linux 对驱动程序提供静态编译进内核和动态加载两种方式,当采用静态方式时,开发者如果想要在系统中启动这个驱动通常调用类似 xxx_init() 接口。a_init();b_init();但是,这种做法在小系统中或许可以,对于 linux 庞大的系统来说,驱动很多,不可能每添加一个驱动就会改动一下 kernel_init() 代码,这将会是一场灾难。在编译的时候,通过使用告知编译器连接,自定义一个专门用来存放这些初始化函数的地址段,将对应的函数入口统一放在一起;

2023-11-02 21:47:18 979

原创 Linux内存管理(八十二):内存检测工具 kfence(2)

kfence虽然代码不多,但设计的内容、逻辑比较多。第一篇重在kfence 基础数据结构、kfence初始化、kfence内存分配和释放;第二篇重在kfence 缺页异常剖析、kfence report剖析、测试框架剖析、具体案例分析;

2023-10-26 11:03:23 412

原创 Linux内存管理(八十一):内存检测工具 kfence(1)

本文 kfence 之外的代码版本是基于 Linux5.10,最近需要将 kfence 移植到 Linux5.10 中,本文借此机会将 kfence 机制详细地记录一下。kfence,全称为,是 Linux5.12 版本新引入的内存使用错误检测机制。kfence 基本原理非常简单,它创建了自己的专有检测内存池 kfence_pool。然后在 data page 的两边加上 fence page 电子栅栏,利用 MMU 的特性把 fence page 设置为不可访问。

2023-10-24 16:34:28 600

基于main log 和event log 对内存问题分析脚本

usage: parse-log.py [-h] [-d] [-f] [-k] [-ki] [-p] [-p20] [-s] [-sk] Parse info of am_pss, am_proc_died and lmkd_kill. Name of source files must be: android_main_log android_events_log

2024-08-14

使用VSCode进行linux内核代码开发(一)

gen_compile_commands.py

2024-01-26

Linux内存管理(六十三):ION 内存管理器-system heap

system heap refill

2023-12-15

Android oom-adj 中trim Bservices 优化

在 OomAdjuster.updateAndTrimProcessLocked() 函数中针对 Bservice进行优化

2023-07-19

Android 中app内存回收优化(一):R版本

配合framework 下CachedAppOptimizer 中的关于 proc reclaim 节点的驱动patch。

2023-07-17

mxml 提炼公共接口

使用mxml 库指定一个标准的接口,使用putInt、getInt、putString、getString、putStringArray、getStringArray等。mxml的详解可以参考https://blog.csdn.net/shift_wwx/article/details/99677421

2019-08-16

gcc和g++详解

1、gcc包含的c/c++编译器 gcc、cc、c++、g++ gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译 2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为test的程序 -o参数用来指定生成程序的名字

2017-10-25

Linux Shell脚本攻略(第2版).pdf

1.1 简介 诸多类Unix操作系统的设计令人惊叹。即便是在数十年后的今天, Unix式的操作系统架构仍是有史以来的最佳设计之一。这种架构最重要的一个特性就是命令行界面或shell。 shell环境使得用户能与操作系统的核心功能进行交互。术语脚本更多涉及的便是这种环境。编写脚本通常使用某种基于解释器的编程语言。而shell脚本不过就是一些文件,我们能将一系列需要执行的命令写入其中,然后通过shell来执行。 本书使用的是Bash(Bourne Again Shell),它是目前大多数GNU/Linux系统默认的shell环境。 鉴于GNU/Linux作为基于Unix式架构最杰出操作系统的地位,书中大部分案例和讨论都假定是在Linux系统环境下进行的。

2017-09-05

Makefile.pdf

什么是 makefile?或许很多 Winodws 的程序员都不知道这个东西,因为那些 Windows 的 IDE 都 为你做了这个工作,但我觉得要作一个好的和 professional 的程序员,makefile 还是要懂 。这就好象现在有这么多的 HTML 的编辑器,但如果你想成为一个专业人士,你还是要了解 HTML 的标识的含义。特别在 Unix 下的软件编译,你就不能不自己写 makefile 了,会不会写 makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、 功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要 先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作, 因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。

2017-09-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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