- 博客(519)
- 资源 (6)
- 收藏
- 关注
原创 Linux 内存管理全面剖析
还是习惯性的以前言开篇,“深入骨髓”的程序猿思想,干啥事都想从main 开始~~在Android 项目中接触内存管理相关的有一段时间了,中间看了很多代码,看了忘,忘了看,反反复复,索性就抽点时间整理出来~~该专栏通过剖析 Linux 5.4 版本的源码,尽可能清晰、完整地总结内存管理相关的知识点,进而展示Linux 内存管理的所有模块的原理。该专栏中的原理会在持续、长期、反复地的剖析中进行补充说明。
2023-05-26 09:52:19 1107
原创 Linux内存管理(二十五):buddy 分配器之rmqueue
经过zone_watermark_fast() 函数进行水位判断,如果无法达到水位要求,会尝试第7、8 两节的流程,但如果第7、8 两节的逻辑都无法满足,那只能跳到下一个 zone 进行分配。当水位检测通过时,或者此次分配不用关注水位时,会接着调用 rmqueue() 函数,这里是内存分配的核心处理函数:
2024-02-04 10:42:38 48
原创 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 949
原创 ramdump 中的memory统计
ramdump是指某个时刻系统或者子系统发生crash等异常,系统将内存中的数据通过一定的方式保存下来,相当于一个系统内存快照,用以开发者离线分析系统异常问题。
2023-12-30 10:32:57 540
原创 Linux 内核参数:vmallocinfo
内存管理是一个相对复杂的内核模块,错综复杂的数据结构和管理逻辑。Linux 内核为了帮助开发者从宏观上把握内存的使用情况,在几大核心数据结构中都有相应的计数统计,如物理页面使用情况、伙伴系统分配情况、内存管理区的页面使用情况、内存回收扫描回收情况、内存规整触发情况等等。在《vmalloc 详解》一文中详细地剖析了vmalloc 的分配、释放流程,系统提供了 /proc/vmallocinfo 节点来查看在vmalloc 区域中分配的内存详细信息。
2023-12-20 16:22:45 812
原创 Linux内存管理(十七):percpu 分配器——初始化
上一篇博文我们剖析了 percpu 分配器基本概念,包括percpup 的静态变量的声明、定义、访问,也包括 percpu 动态变量的声明、定义、访问,并详细地总结了 percpu 分配器中的几个重要数据结构以及含义、原理。另外,我们得知内核初始化在 setup_arch()初始化完成后,会返回 start_kernel() 进行进一步的初始化,percpu 分配器初始化刻不容缓的通过调用函数完成。因为percpu 分配器初始化的流程内容太多,本文将其中核心函数单独抽出来剖析。
2023-12-18 15:24:08 745
原创 Linux 中的 waitqueue 机制详解
等待队列这个机制在Linux 内核中使用的频率很高,与进程调度机制紧密相关联,可以用来同步对系统资源的访问、异步事件通知、跨进程通信等。网上关于等待队列使用的优秀文章也很多,之所以笔者也写一篇,一是想更新下最新代码中的使用,二是融入些自己的拙见,方便自己回头查看,也希望能有助于后来读者。
2023-12-14 20:20:57 935
原创 Linux 中的 container_of 原理
这个宏函数在Linux 内核中使用的频率还是很多的。网上关于 container_of 使用的优秀文章也很多,之所以笔者也写一篇,一是想更新下最新代码中的使用,二是融入些自己的鄙见,方便自己回头查看,也希望能有助于后来读者。
2023-12-13 15:51:56 890
原创 Linux内存管理(十八):percpu 分配器——动态分配
上一篇博文我们剖析了 percpu 机制的整个框架,包括percpu 中每个 cpu unit 的管理、内存区间的分配、静态percpu 变量的访问、reserved chunk和first chunk 的创建等流程。
2023-12-11 14:15:50 999
原创 Linux scatterlist 详解
之前在《Linux DMA... 零拷贝》博文分享了DMA 技术和零拷贝技术,在进行I/O设备和内存的数据传输的时候,数据搬运的工作全部交给DMA 控制器,而CPU 不再参与任何与数据搬运相关的事情,这样CPU就可以去处理别的事务。用户层与外设或子系统可能需要大量数据交互,这样就需要大量的内存,而随着系统的长时间运行,物理内存可能存在大量的碎片,想要申请很大的一块物理内存已经成为奢望。并且,从性能方面考虑,用户层和子系统都希望减少交互的次数,更希望一次性将数据都交给 DMA控制器搬运。
2023-11-30 16:25:50 1634
原创 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 1117
原创 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 1018
原创 Linux内存管理(十六):percpu 分配器——基本原理
随着 SMP(对称多处理器架构)的发展,在享受处理器更快的执行效率的同时,也为数据同步带来了更大的挑战,因为在 SMP 架构中,程序确实是在并发执行,从单 CPU 只需要考虑调度风险,到SMP 中还需要考虑多 CPU 中同时执行的风险,而且在单 CPU 下乱序执行也会在 SMP 架构中带来,从而也衍生了一些新的同步机制,例如:内存屏障、percpu 机制等等。
2023-11-10 19:31:46 288
原创 GNU链接脚本详解
每一个链接都是由链接脚本控制的,链接脚本是用链接命令语言编写的脚本。链接都会用到一个链接脚本,如果你没有指定自己的脚本,就会使用默认的链接脚本。可以用 "--verbose" 命令行选项显示默认的连接脚本。指定命令行参数,比如 '-r'、'-N'都会影响默认的链接脚本。也可以用 '-T' 来指定自己的链接脚本,也可以隐式地把自己的连接脚本当成链接输入文件,就像普通的链接文件一样,参见链接文件说明。如上图,链接器是将多个对象文件链接成可执行程序。链接器输入文件:目标文件或链接脚本文件;
2023-11-07 17:09:11 538
原创 Linux 内核链接脚本vmlinux.lds.S详解
现代软件工程中,一个大的工程通常都会有多个源文件组成,其中包括高级计算机语言编写的源文件,以及汇编语言编写的汇编文件。在编译构建过程中会分别对这些源文件进行汇编、编译生成目标文件,这些目标文件包含:代码段、数据段、符号表等内容。链接器主要任务是将符号引用解析到符号定义上,将多个目标文件和库文件合并成为一个可执行文件或者动态链接库,生成符号表,并对程序代码做最后的检查和优化。本文主要针对 ARM64架构的连接脚本进行剖析。因为 vmlinux.lds.S 的内容比较多,本文将其拆分后分析。
2023-11-03 20:50:45 608
原创 Linux 中的 initcall 机制详解
Linux 对驱动程序提供静态编译进内核和动态加载两种方式,当采用静态方式时,开发者如果想要在系统中启动这个驱动通常调用类似 xxx_init() 接口。a_init();b_init();但是,这种做法在小系统中或许可以,对于 linux 庞大的系统来说,驱动很多,不可能每添加一个驱动就会改动一下 kernel_init() 代码,这将会是一场灾难。在编译的时候,通过使用告知编译器连接,自定义一个专门用来存放这些初始化函数的地址段,将对应的函数入口统一放在一起;
2023-11-02 21:47:18 358
原创 Linux内存管理(七十三):内存检测工具 kfence(2)
kfence虽然代码不多,但设计的内容、逻辑比较多。第一篇重在kfence 基础数据结构、kfence初始化、kfence内存分配和释放;第二篇重在kfence 缺页异常剖析、kfence report剖析、测试框架剖析、具体案例分析;
2023-10-26 11:03:23 292
原创 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 409
原创 使用VSCode进行linux内核代码开发(一)
Linux 内核代码量非常的庞大,其中又包含了各种平台的宏定义开关、配置,外加各种结构体指针的注册,这使得阅读内核代码变成一件令人头疼的事。本文先介绍 WSL + VSCode + clangd。
2023-10-12 21:21:59 339
原创 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 683
原创 Linux内存管理(七):start_kernel 详解
在bootloader 做好初始化工作后,将 kernel image 加载到内存后,就会跳到kernel 部分继续执行,跑的先是汇编部分的代码,进行各种设置和环境初始化后,就会跳到 kernel 的第一个函数start_kernel() 完成内核系统的所有配置和初始化,其中 setup_arch() 是早期系统的配置和初始化工作。该系列专栏,会通过源码的深入剖析来查看内存管理系统的原理。本文将会是这个系列专栏代码剖析的起点。
2023-09-18 11:25:43 379
原创 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 228
原创 GTS 中testPeakPssOfAllApps fail 详解
GTS 在测试 case armeabi-v7a GtsMemoryHostTestCases 的时候出现下面异常,本文总结一下。com.google.android.memory.gts.AllAppsMemoryHostTest#testPeakPssOfAllApps
2023-09-14 20:50:56 317
原创 GTS 中testPersistentProcessMemory fail 详解
进入测试函数 testPersistentProcessMemory():首先通过calculatePersistentMemoryUsage() 函数确定经过 dupmsys -t 30 meminfo 之后所有 Persistent 进程的内存,存放在变量 memoryKb 中。接着通过getMaxPersistentMemoryAllowed() 函数,确定 GTS 允许的最大 persistent memory,存放在变量 maxMemoryKb中。
2023-09-14 17:13:33 184
原创 Linux内存管理(十一):reserved-memory 详解
随着内核的运行,内核中的物理内存越来越趋向于碎片化,但是某些特定的设备在使用时用到的 DMA 需要大量的连续物理内存,这可能导致设备在真正使用的时候因为申请不到满足要求的物理内存而无法使用,这显然是不能接受的。最简单的方式就是为特定设备预留一部分物理内存专用,这部分内存不受系统的管理,绑定到特定的设备,在设备需要使用的时候再对这部分内存进行管理,这就是内核中提供的。
2023-08-17 11:16:13 1212
原创 Android 中 app freezer 原理详解(二):S 版本
在之前的两篇博文《Android 中app内存回收优化(一)》和《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过 CachedAppOptimizer 类管理,为什么叫这个名字,而不叫 AppCompact 等?freezer,一个针对应用进程长期处于 Cached 状态的优化。在之前博文《app freezer 原理 R 版本》
2023-07-28 17:44:01 1165 1
原创 Android 中 cgroup抽象层详解
在之前的博文《Android中app freezer原理》一文中,我们看到冻结器的enable、freeze、unfreeze 都是通过 cgroup 的机制进行处理。本文将介绍下 Android 中 cgroup 的抽象层基本信息和使用方式。) 是 Linux 内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对 CPU、memory 等资源实现精细化的控制。目前越来越活的轻量级容器 Docker 就使用了 cgroups 提供的资源限制能力来完成 CPU、memory 等部门的资源控制。
2023-07-21 18:06:48 1351
原创 Android 中 app freezer 原理详解(一):R 版本
在之前的两篇博文《Android 中app内存回收优化(一)》和《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过类管理,为什么叫这个名字,而不叫 AppCompact 等?freezer,一个针对应用进程长期处于 Cached 状态的优化。本文将继续分析 CachedAppOptimizer 类另一个功能 freezer。1. Freezer 简介。
2023-07-21 16:08:07 1891
原创 Android 中app内存回收优化(二):S 版本
Android Q 中新增了framework 端app 内存回收优化方案。当app 的 oom adj 发生特定变化时,framework 端会对应用的内存进行处理。随着版本的演变,这部分优化工作也一直在完善,笔者将针对Android R和Android S对该部分的优化流程分别进行详细地剖析。在上一文中,针对Android R版本进行了详细的剖析,本文继续剖析 Android S 版本。
2023-07-17 17:29:22 2077 7
原创 Android 中app内存回收优化(一):R版本
Android Q 中新增了framework 端app 内存压缩优化方案。当app 的 oom adj 发生特定变化时,framework 端会对应用的内存进行处理。随着版本的演变,这部分优化工作也一直在完善,笔者将针对Android R和Android S对该部分的优化流程分别进行详细地剖析。本文针对 Android R。
2023-07-14 17:40:14 2361
原创 Android oom_adj 详细解读
在博文《oom_adj 内存水位算法剖析》一文中详细的分析了lmkd 中针对 oom_adj 内存水位的计算、使用方法,在博文《oom_adj 更新原理(1)》《oom_adj 更新原理(2)》中对Android 系统中 oom_adj 的更新原理进行了详细的剖析。通过这几篇博文我们对 oom_adj 有了更深地了解。本文在之前博文的基础上,剖析代码细节,对每个 oom_adj 的值进行详细地解读。
2023-07-14 17:10:34 1126
原创 Android oom_adj 更新原理(一)
通过之前的两篇博文《lmkd 机制详解》和《lmkd中adj score的算法剖析》中,根据计算出来的 min_score_adj 选择大于该值的 oom_adj 的进程进行 kill 处理。oom_adj 随着应用状态的不同其值也是伴随着变化的。本文将通过源码剖析 oom_adj 更新的原理。
2023-07-07 20:29:39 1218 1
原创 进程间通信(7)——套接字
进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如:它们都仅限于本地进程间通信。而网络间通信要解决的是不同主机进程间的通信问题(可把同机进程间通信看成一个特例)。同一主机上,不同进程可用进程号(process ID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。
2023-07-07 16:55:14 1201
原创 Android Binder通信原理(八):IPC权限控制
binder 简介servicemanager启动service注册service获取Java 端的service 注册和获取、native下的C-Sjava 下的C-S。本文进一步分析 IPC 下的权限控制。
2023-07-04 10:46:27 726
原创 Android Binder通信原理(七):java 下的C-S
binder 简介servicemanager启动service注册service获取Java 端的service 注册和获取。在前一文中,通过实例,详细地说明了native 下 的C-S 通信原理。本文在之前的基础上,以实例的形式进一步的分析 java 下的 C-S 通信。
2023-06-28 15:12:07 706
原创 Android Binder通信原理(六):native下的C-S
binder 简介servicemanager启动service注册service获取Java 端的service 注册和获取。本文在之前的基础上,以实例的形式进一步的分析 native 下的 C-S 通信。
2023-06-28 14:43:47 847
原创 Android Binder通信原理(五):Java 端的service 注册和获取
在阐述相关的知识点,先整理个框架图,后面带着框架图来分析过程:Java 端service 的注册使用 ServiceManager.addService()Java 端service 的获取使用 ServiceManager.getService()入口都是通过 ServiceManager.java,文件位于frameworks/base/core/java/android/os/ServiceManager.java。
2023-06-27 17:21:57 1562
原创 Android Binder通信原理(四):service获取
上一文中已经得知如何通过 defaultServiceManager() 得来的 BpInterface 与 servciemanager 进行通信,并分析了addServcie() 的流程,这里再来看下service 的获取过程。
2023-06-27 10:19:50 1192
Android oom-adj 中trim Bservices 优化
2023-07-19
mxml 提炼公共接口
2019-08-16
gcc和g++详解
2017-10-25
Linux Shell脚本攻略(第2版).pdf
2017-09-05
Makefile.pdf
2017-09-05
Linux shell 脚本攻略(第2版).pdf
2017-09-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人