- 博客(561)
- 资源 (6)
- 收藏
- 关注
原创 Linux 内存管理全面剖析
还是习惯性的以前言开篇,“深入骨髓”的程序猿思想,干啥事都想从main 开始~~在Android 项目中接触内存管理相关的有一段时间了,中间看了很多代码,看了忘,忘了看,反反复复,索性就抽点时间整理出来~~该专栏通过剖析 Linux 5.4 版本的源码,尽可能清晰、完整地总结内存管理相关的知识点,进而展示Linux 内存管理的所有模块的原理。该专栏中的原理会在持续、长期、反复地的剖析中进行补充说明。
2023-05-26 09:52:19
1775
原创 举例证明写时拷贝 (COW)
本文通过实验探讨了Linux下fork()创建子进程时的内存管理机制。实验结果显示:1) 父进程和子进程最初共享相同的物理内存地址空间;2) 触发写时复制(COW)后才为修改的变量分配新的物理内存;3) 堆内存(heap)的行为取决于具体实现方式 - 普通malloc分配的内存会触发COW,而mmap分配的堆内存会被共享;4) 父进程和子进程谁先访问内存谁就会触发COW机制。实验结果表明,fork()时并非立即复制全部内存,而是采用写时复制的优化策略,只有当进程尝试修改共享内存时才会真正分配新的物理内存。
2025-10-30 18:38:42
935
原创 Android lmkd 机制详解(总篇)
本文梳理了Android系统中低内存终止守护进程(lmkd)的演进与机制。从内核LMK驱动过渡到用户空间lmkd,重点分析了PSI监视器在Android 10+中的引入及其优势。文章详细阐述了lmkd框架的核心组件,包括socket通信、epoll监听、异步查杀等机制,并对比了不同Android版本的特性变化。同时介绍了lmkd的关键属性值和epoll事件处理机制,包括压力级别监控、进程终止处理等,为理解Android内存管理提供了系统性的技术参考。
2025-10-11 11:23:24
358
原创 Android lmkd 机制从R到T
本文对比了Android 11(R)和Android 13(T)中lmkd机制的差异点。主要变化包括:1)引入watchdog机制,通过独立线程监控处理事件的超时情况,默认2秒超时后会强制终止高优先级进程;2)新增reaper功能,通过线程池异步处理进程终止和内存回收,避免主线程阻塞导致PSI事件丢失,同时支持process_mrelease系统调用加速内存回收。这些改进使lmkd在高内存压力下更加稳定高效。文章详细分析了相关代码实现逻辑,包括watchdog定时器、reaper线程池等核心机制。
2025-10-10 10:59:44
91
原创 Android dmabuf_dump 命令详解
摘要:dmabuf_dump工具用于分析DMA缓冲区使用情况,支持多种参数选项: -a显示所有dmabuf的表格视图 -b显示每个缓冲区的详细统计 -o指定输出格式(raw/csv) 可指定进程PID查看特定进程信息 工具通过解析/proc/PID/fdinfo和/proc/PID/maps获取dmabuf信息,同时读取/sys/kernel/dmabuf/buffers获取缓冲区大小和导出者名称,最终统计内核层和用户层的内存使用量。核心功能包括检测活跃dmabuf、处理fd关闭但映射未解除的情况,并通过i
2025-10-04 12:13:48
1188
原创 Linux 内核参数:pid 系列
本文分析了Linux 6.1内核中/proc/<pid>/stat节点的实现机制。该节点通过tgid_base_stuff结构体数组定义,其中proc_tgid_stat()函数调用do_task_stat()来输出进程状态信息。do_task_stat()使用seq_put系列函数按固定格式输出52个字段,包括进程PID、名称、状态、父子进程关系、CPU时间、内存使用情况、信号状态等关键信息。每个字段都有详细说明,如state字段使用R/S/D/Z/T/W表示不同进程状态,utime/stim
2025-09-16 10:04:14
225
原创 Linux 内核参数:drop_caches
Linux内核中/proc/sys/vm/drop_caches机制分析 摘要:本文深入分析了Linux 5.10内核中/proc/sys/vm/drop_caches的实现机制。该接口允许用户手动释放不同类型的系统缓存:1释放页缓存,2释放可回收slab对象,3同时释放两者,4关闭日志输出。核心实现通过drop_caches_sysctl_handler函数处理,使用iterate_supers()遍历所有super_block并调用drop_pagecache_sb()释放页缓存,通过drop_slab
2025-08-14 17:06:24
318
原创 win11 中WSL 详解以及vscode进行Linux代码开发
WSL,全程是,是允许用户在 windows 运行 Linux 环境的特性功能,且无需单独的虚拟机和dual booting。WSL 旨在为希望同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。使用 WSL 安装和运行各种 Linux 发行版,例如 Ubuntu、Debian、Kali 等;提供诸如 bash 的命令行工具;运行 bash 脚本和 GNU/Linux 命令行应用,包括:工具:vim、emacs、tmux。
2025-05-05 19:43:03
1954
原创 ubuntu 安装samba
如果是第一次为这个用户设置密码就需要加上-a,后面配置密码就不用加上-a了。如果在第一次设置一个用户的密码不加上-a的选项的话,就会在设置密码时报出错误。启动samba,或者 restart samba。确认IP 地址,使用ifconfig 命令。
2025-04-13 15:53:47
1592
原创 Linux内存管理(08):fdt 详解
在前文中 fixmap进行详细的剖析,fixmap会在内核系统中预留一段虚拟内存用以固定映射,并且通过接口根据的偏移量获取相应的虚拟内存作为分配策略,然后调用填充 ptep,完成页表映射。本文将在此基础将 dtb 的物理内存与fixmap 的虚拟内存进行填充映射,并详细剖析 dtb 的映射、扫描、解析过程。至此,就剖析完成,主要是通过对dtb 的物理内存进行映射,映射区域在 fixmap 中 FDT 区域,并获取到映射之后的虚拟地址。接着会将 dtb 这块区域添加到 memblock。
2025-04-10 15:22:08
463
原创 Linux内存管理(09):启动参数详解
在《fixmap详解》一文中看到在 fixmap 会在内核系统中预留一段虚拟内存用以固定映射,并通过函数 setup_machine_fdt() 对 dtb 内核区域进行映射和解析,其中包括内核的启动参数boot_command_line。启动参数的定义;启动参数的加载;启动参数的实现;
2025-04-06 17:21:43
879
原创 Linux内存管理(104):Page Extension 详解
为了动态使用 page extension 的扩展功能,这里的结构体数组 page_ext_ops 将包含所有的扩展功能,而系统通过 page extension 实际使能的扩展功能,则通过各扩展功能的 need callback,详细查看下文 invoke_need_callback() 函数。在page_ext 初始化时,在函数 invoke_need_callbacks() 中统计 page_ext_ops 数组中支持的所有扩展功能占用的大小,也就是page_ext 的大小。
2025-03-31 07:07:08
454
原创 Linux内存管理(113):page table
在中有个 PageTables 的属性值,该属性值具体统计的是哪些内存呢?在用户层的虚拟内存与物理内存映射时,是怎么样的映射方式?如何通过虚拟地址找到手机的物理地址?在内存老化、回收时,系统如何扫描,又如何通过扫描页表识别冷、热页?页表查询过程简述TTBRn:由虚拟地址最高位 bit[63] 决定,如果该位为 1,表示这个地址用于内核空间,页表的基地址寄存器用TTBR1;若该位为0,表示这个地址属于用户空间,页表的基地址寄存器用 TTBR0。
2025-03-26 16:26:41
751
原创 Linux内存管理(106):Memory allocation profiling 原理简介
Memory allocation profiling 是 Linux 6.12 中的重要功能。帮助开发者和系统管理员理解内存的使用情况,在MAP 中每一次的内存分配都可以精确地追溯到具体的代码行,可以轻松地识别分配的源头。无论是内核代码还是需要加载的模块代码。
2025-03-23 11:11:26
884
原创 Linux 中的 likely 和 unlikely
likely()、unlikely() 原理是利用了GCC 的内建函数(),通过编译器预测代码分支;GCC 编译器会将不希望的代码分支放最后;GCC 可能优先执行期盼的执行,再进行判断,不同的编译器版本实现方式不同;likely() 表示该表达式为 “True” 的概率大一些,unlikely() 表示改表达式为 “True” 的概率小一些;likely()、unlikely() 通过分支预测指令的预取能提高代码的执行效率。
2025-03-16 17:37:43
1107
原创 Linux内存管理(112):zero page
在实际应用程序场景中,经常存在其虚拟内存已经申请,且只对该内存进行读取过,但是从未对该内存进行过写操作,如果针对此场景发生只读page fault时,也为其虚拟内存区域全部申请对应物理内存将会极大浪费内存 因为后面从没有对该内存真正进行写过。当内存先读后写时,会触发两次page fault,先触发读内存page fault 使用zero page刷新对应映射,然后由于写内存会再次触发 page fault才生成新的实际物理内存,相对之前一次触发page fault,消耗可能会增多。
2025-03-02 15:11:44
331
原创 Linux内存管理(111):struct page 成员参数详解
当alloc_pages() 分配page 后,后面每一个引用该 page 的用户,都需要通过 get_page()将此 page->_refcount++,代表再多一个用户使用该 page。站在buddy 分配器的角度来看,此时的 pages 相当于被分配出去,memblock 在使用所有的pages。在 buddy 分配器初始化时,从memblock_free_all() -> __free_pages_core() -> set_page_count() 将。用以初始化 _refcount 为 1;
2025-02-12 11:27:00
563
原创 Linux内存管理(115):mlock() 与 Unevictable
同 mlock(),这里也是通过 apply_vma_lock_flags() 修改 vma->vm_flags,只不过 mlock() 带入的是 VM_LOCKED,而这里是0.该demo 使用 mlock 确认memory 的统计,申请了 10M 的内存,并通过 mlock() 进行锁定,确认这部分内存的归属。锁定的内存都会被计入/proc/meminfo 中的Mlocked,同时也会计入到。
2025-02-08 10:58:56
475
原创 Android lmkd 中的那些属性值
LOW_MEM 原因查杀时,指定的 min_score_adj 最终与 PERCEPTIBLE_APP_ADJ + 1 比较,取最大值。当 cycle_after_kill && wmark < WMARK_LOW 时,指定min_score_adj。swap 内存的利用率,用以确定是否有可回收的内存,如果达到该阈值,则表示因无法swap引起的内存压力。严重失速限定值,当 FULL_10 大于该值,标记严重失速,min_score_adj 将指定到0。
2025-01-16 14:29:09
2264
原创 Linux内存管理(83):Linux PSI 详解(3)
在《PSI 详解(2)》上一文中详细剖析了 PSI 初始化过程、数据采集过程、状态更新过程,也将cgroup 关于PSI 的注意点和流程一并整理。本文将继续上文,重点剖析 PSI 接下来对于数据的统计过程,包括对每个 psi_trigger 的poll 机制的响应,以及显示需要的运行平均值计算。负责 psi trigger 的polling 功能,入口函数为 psi_schedule_poll_work();
2024-11-14 14:29:27
570
原创 Python 制作自定义库实践
随着工具开发的功能日益强大,模块化已经是大势所趋,所以,需要将整个工具项目的公共部分提取并制作为自定义的库。网上很多优秀的文章可以参考,作为小白的笔者结合了自己的实践经验,做一个小结,利己利人~~
2024-11-04 14:30:50
1427
原创 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
2899
原创 Linux 中的同步机制——rwsem
读写信号量的原理与读写锁类似,读写信号量归根到底是“信号量”,读写锁归根到底是“自旋锁”,而信号量与自旋锁的区别一个可以睡眠,一个只能自旋。允许多个读者同时进入临界区;读者与写者不能同时进入临界区(读者与写者互斥);写者与写者不能同时进入临界区(写者与写者互斥);
2024-08-15 21:59:07
1511
原创 Linux 中的同步机制
指哪些在同一时刻只允许被一个线程访问的软件或硬件资源。这种资源的特点是,如果有线程正在使用,其他进程必须等待直到该线程释放资源。指在每个线程中访问临界资源的那段代码。由于临界资源需要互斥访问,因此每个线程的临界区代码在执行时需要确保没有其他现成同事访问该资源。
2024-08-13 09:48:00
1575
原创 Android 埋点信息分析——内存篇
在前一篇《Android statsd 埋点简析》一文中简单剖析了Android 埋点采集、传输的框架,本文在其基础对埋点信息进行解析,来看下Android 中埋下的内存信息有哪些。
2024-08-06 09:42:16
1838
原创 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
1693
2
原创 Android 埋点信息分析——statsd框架
StatsPullAtomService 用以采集数据,并将数据填充到参数中,在StatsManager.PullAtomCallbackInternal 中会转换成 Parcel 格式传入到 native。StatsCallbackPuller::PullInternal 中会回调StatsManager.PullAtomCallbackInternal 的onPullAtom,该函数中会回调StatsCallbackPuller::PullInternal 中定义的PullResultRecei
2024-07-26 11:37:18
2242
原创 记:我在 CSDN 的4096天
我也是在这些巨人的影响下,一点一滴地分享着自己的 “所见所闻”,从最开始学习优秀博主的创作风格,到现在形成自己的创作流程;,他们毫不吝啬地将自己所了解的最新讯息、最前言的技术、最完整的分析过程都毫无保留地分享给读者,让后来的小伙伴们能在巨人的肩膀上继续耕耘在自己的一份土地上。5. 别真的傻站着等被裁员,你没工作的时候,很痛苦,所以,知道要干嘛吗?4. 被裁员了,别抱怨,是你自己没那实力,所以,知道要干嘛吗?天的创作,也是自己留给自己的人生轨迹中弥足珍贵的回忆。3. 还没退休呢,继续努力吧,中年;
2024-07-15 10:38:31
639
原创 Linux内存管理(86):memcg v1 简介
全局 LRU 会swap out 任意的页数,swap out 意味着内存搬移到swap,对于memory +swap 是没有变化的。也就是说,当我们想限制swap 使用而没有影响全局 LRU,-站在操作系统的角度,限制 memory+swap 要比限制swap 好。
2024-06-28 10:13:08
1029
原创 Linux内存管理(85):memcg v2 简介
本文介绍了Linux内核(6.6版本)中cgroup v2的内存控制子系统(memcg)的关键节点文件及其实现机制。主要内容包括:1. 详细解析了memcg各节点文件的功能,如memory.current、memory.min、memory.max等,说明其读写属性和内存管理行为;2. 重点分析了memory.reclaim主动回收机制的实现,指出其可能存在的无限重试问题;3. 对比了memory.swap.high和memory.swap.max的区别,说明达到限制时的不同处理策略;4. 阐述了memor
2024-06-27 15:48:05
1116
原创 Linux内存管理(84):cgroup v2 简介
术语:cgroup:control group 的缩写,永不大写(never capitalized);单数形式的 cgroup 用于指定整个特性,也用作等术语中的修饰符;复数形式的 cgroups 显式指多个独立的;cgroup 是一种机制,它将系统进程按照分层组织,并沿着这种分层以一个可控、可配置的方式来分配系统资源。
2024-06-27 10:17:23
941
原创 Virtualbox 安装 ubuntu + qemu
关于 Virualbox 安装虚拟机的优秀文章太多了,笔者主要是着重梳理一些安装小细节,利己利人!!如果需要保姆式的安装教程,可以查看后续的参考链接。
2024-06-04 10:44:28
2146
1
原创 Linux内存管理(82):Linux PSI 详解(2)
在《PSI 详解(1)》上一文中整理的 PSI 的原理和一些重要的数据结构,本文将在其基础上,详细剖析 PSI 初始化过程、数据采集过程、数据统计过程,也将cgroup 关于PSI 的注意点和流程一并整理。PSI 功能依赖CONFIG_PSI,当该 config 没有使能,psi.c是不会被编译到 image的。
2024-05-29 19:00:15
1706
原创 设置线程 CPU 亲和性的几种方式
线程CPU 亲和性分两种:软亲和性和硬亲和性。软亲和性主要由操作系统来实现,Linux 操作系统的调度器会倾向于保持一个进程不会频繁在多个 CPU 之间迁移,通常情况下调度器都会根据各个 CPU 的负载情况合理地调度运行中的进程,以减轻繁忙 CPU 的压力,提高所有进程整体性能。硬亲和性由用户调用系统 API 实现自定义进程运行在指定的 CPU 上,从而满足特定进程的特殊性能需求。
2024-05-21 22:06:53
3561
原创 dumsys meminfo 细节之 memtrack
从前文中得知,无论是 getMemoryInfo() 还是 getPss() 函数,都会调用函数收集 graphics 的内存。这其中涉及dmabuf 等相关信息,本文将各个类型的 memtrack 的统计过程。
2024-05-21 10:47:46
2176
原创 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
1657
原创 Android ashmem 原理分析
ashmem称为匿名共享内存(Anonymous),它以驱动程序的形式实现在内核空间中。它有两个特点:能否辅助内存管理系统来有效地管理不再使用的内存块(pin / unpin);通过Binder进程间通信机制来实现内存共享;虽然 Binder机制已经可以实现了跨进程的高效通信,但是Binder 通信所允许的数据是有限制的(如下代码),如果需要大量数据交互就有限制了。
2024-05-11 16:33:46
1756
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
1877
2
原创 dumpsys meminfo 详解(U)
不同的版本 meminfo 的统计还是出现了少许的变化,本文继《meminfo 详解 R版本》一文,进一步补充U 版本的dumpsys meminfo 的统计流程。
2024-05-06 10:23:36
2269
基于main log 和event log 对内存问题分析脚本
2024-08-14
gcc和g++详解
2017-10-25
Makefile.pdf
2017-09-05
Android oom-adj 中trim Bservices 优化
2023-07-19
Linux Shell脚本攻略(第2版).pdf
2017-09-05
mxml 提炼公共接口
2019-08-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅