自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

私房菜

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

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

原创 Linux 内存管理全面剖析

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

2023-05-26 09:52:19 1212

原创 记:我在 CSDN 的4096天

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

2024-07-15 10:38:31 305

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

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

2024-06-28 10:13:08 263

原创 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 299

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

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

2024-06-27 10:17:23 81

原创 Virtualbox 安装 ubuntu + qemu

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

2024-06-04 10:44:28 1003 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 794

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

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

2024-05-21 22:06:53 971

原创 dumsys meminfo 细节之GPU memory

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

2024-05-21 10:47:46 990

原创 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 904

原创 Android ashmem 原理分析

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

2024-05-11 16:33:46 1177 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 933 2

原创 dumpsys meminfo 详解(U)

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

2024-05-06 10:23:36 1159

原创 Linux 内核 delayacct 原理分析

启动参数中默认是使能的,可以在启动参数中添加 nodelayacct 来disable,截止 5.10 版本都是通过该参数进行 disable。最新的版本也可以通过 sysctl 的 kernel.task_delayacct 进行开关。在系统启动后,可以使用。

2024-04-28 12:00:00 1085

原创 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 956

转载 Linux下/proc目录简介

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

2024-04-09 09:33:45 910

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

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

2024-02-04 10:42:38 127

原创 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 1020

原创 ramdump 中的memory统计

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

2023-12-30 10:32:57 732

原创 OH中的 sanitizer 详解

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

2023-12-28 18:06:49 5256

原创 Linux 内核参数:vmallocinfo

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

2023-12-20 16:22:45 960

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

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

2023-12-18 15:24:08 813

原创 Linux 中的 waitqueue 机制详解

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

2023-12-14 20:20:57 1431

原创 Linux 中的 container_of 原理

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

2023-12-13 15:51:56 954

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

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

2023-12-11 14:15:50 1094

原创 Linux scatterlist 详解

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

2023-11-30 16:25:50 2257

原创 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 1301

原创 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 1141

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

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

2023-11-10 19:31:46 418

原创 GNU链接脚本详解

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

2023-11-07 17:09:11 1013

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

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

2023-11-03 20:50:45 1205

原创 Linux 中的 initcall 机制详解

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

2023-11-02 21:47:18 735

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

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

2023-10-26 11:03:23 363

原创 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 528

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

Linux 内核代码量非常的庞大,其中又包含了各种平台的宏定义开关、配置,外加各种结构体指针的注册,这使得阅读内核代码变成一件令人头疼的事。本文先介绍 WSL + VSCode + clangd。

2023-10-12 21:21:59 583 1

原创 git rebase 修改中间的commit

今天在移植最新版本 kfence 功能的时候,一共需要移植大概40多个 patch,中间有很多patch 存在冲突,需要手动修改后才能合并。当所有的patch 都合并完成进行编译的时候,发现其中一个 patch 手动合并出了个错误。假如共有 40 个 patch,编号 1 - 40,现在问题是第 20 个patch 需要再修改一下,而 21 - 40 的patch 有很多手动修改的,怎么能快速有效的在不 reset 的基础上修改第 20 个patch呢?这就是本文需要说明的命令。

2023-09-21 19:34:50 924

原创 Linux内存管理(七):start_kernel 详解

在bootloader 做好初始化工作后,将 kernel image 加载到内存后,就会跳到kernel 部分继续执行,跑的先是汇编部分的代码,进行各种设置和环境初始化后,就会跳到 kernel 的第一个函数start_kernel() 完成内核系统的所有配置和初始化,其中 setup_arch() 是早期系统的配置和初始化工作。该系列专栏,会通过源码的深入剖析来查看内存管理系统的原理。本文将会是这个系列专栏代码剖析的起点。

2023-09-18 11:25:43 553

原创 Linux内存管理(十三):unflatten_device_tree 详解

对于 debug 版本若通过节点查看,会发现很多细小的reserved hole。在之前《reserved-memory 详解》一文中分析了dts 中 reserved-memory 部分的内存 reserved 过程,这些内存都是工程师根据平台需要定义好的。在《paging_init 详解》一文中在进行 map_kernel 和 map_mem 映射时创建了很多的页表,系统将这部分的内存也当成了 reserved memory。本文将继上面分析系统 reserved 的另一块细小的 memory。

2023-09-15 18:36:20 324

原创 GTS 中testPeakPssOfAllApps fail 详解

GTS 在测试 case armeabi-v7a GtsMemoryHostTestCases 的时候出现下面异常,本文总结一下。com.google.android.memory.gts.AllAppsMemoryHostTest#testPeakPssOfAllApps

2023-09-14 20:50:56 382

原创 GTS 中testPersistentProcessMemory fail 详解

进入测试函数 testPersistentProcessMemory():首先通过calculatePersistentMemoryUsage() 函数确定经过 dupmsys -t 30 meminfo 之后所有 Persistent 进程的内存,存放在变量 memoryKb 中。接着通过getMaxPersistentMemoryAllowed() 函数,确定 GTS 允许的最大 persistent memory,存放在变量 maxMemoryKb中。

2023-09-14 17:13:33 247

使用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关注的人

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