自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

私房菜

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

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

原创 Linux 内存管理全面剖析

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

2023-05-26 09:52:19 1119

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

转载 Linux下/proc目录简介

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

2024-04-09 09:33:45 25

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

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

2024-02-04 10:42:38 79

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

原创 ramdump 中的memory统计

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

2023-12-30 10:32:57 591

原创 OH中的 sanitizer 详解

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

2023-12-28 18:06:49 3486

原创 Linux 内核参数:vmallocinfo

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

2023-12-20 16:22:45 847

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

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

2023-12-18 15:24:08 759

原创 Linux 中的 waitqueue 机制详解

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

2023-12-14 20:20:57 1056

原创 Linux 中的 container_of 原理

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

2023-12-13 15:51:56 900

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

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

2023-12-11 14:15:50 1012

原创 Linux scatterlist 详解

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

2023-11-30 16:25:50 1798

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

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

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

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

2023-11-10 19:31:46 313

原创 GNU链接脚本详解

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

2023-11-07 17:09:11 893

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

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

2023-11-03 20:50:45 801

原创 Linux 中的 initcall 机制详解

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

2023-11-02 21:47:18 417

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

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

2023-10-26 11:03:23 305

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

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

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

2023-10-12 21:21:59 380

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

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

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

2023-09-18 11:25:43 415

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

原创 GTS 中testPeakPssOfAllApps fail 详解

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

2023-09-14 20:50:56 339

原创 GTS 中testPersistentProcessMemory fail 详解

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

2023-09-14 17:13:33 218

原创 Linux内存管理(十一):reserved-memory 详解

随着内核的运行,内核中的物理内存越来越趋向于碎片化,但是某些特定的设备在使用时用到的 DMA 需要大量的连续物理内存,这可能导致设备在真正使用的时候因为申请不到满足要求的物理内存而无法使用,这显然是不能接受的。最简单的方式就是为特定设备预留一部分物理内存专用,这部分内存不受系统的管理,绑定到特定的设备,在设备需要使用的时候再对这部分内存进行管理,这就是内核中提供的。

2023-08-17 11:16:13 1426

原创 Android 中 app freezer 原理详解(二):S 版本

在之前的两篇博文《Android 中app内存回收优化(一)》和《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过 CachedAppOptimizer 类管理,为什么叫这个名字,而不叫 AppCompact 等?freezer,一个针对应用进程长期处于 Cached 状态的优化。在之前博文《app freezer 原理 R 版本》

2023-07-28 17:44:01 1303 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 1546

原创 Android 中 app freezer 原理详解(一):R 版本

在之前的两篇博文《Android 中app内存回收优化(一)》和《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过类管理,为什么叫这个名字,而不叫 AppCompact 等?freezer,一个针对应用进程长期处于 Cached 状态的优化。本文将继续分析 CachedAppOptimizer 类另一个功能 freezer。1. Freezer 简介。

2023-07-21 16:08:07 2171

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

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

Android Q 中新增了framework 端app 内存压缩优化方案。当app 的 oom adj 发生特定变化时,framework 端会对应用的内存进行处理。随着版本的演变,这部分优化工作也一直在完善,笔者将针对Android R和Android S对该部分的优化流程分别进行详细地剖析。本文针对 Android R。

2023-07-14 17:40:14 2470

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

原创 Android oom_adj 更新原理(二)

通过 mAdjSeq 确认此次计算是否有必要,是否已经计算过;判断是否为空进程;当maxAdj

2023-07-13 10:55:06 932

原创 Android oom_adj 更新原理(一)

通过之前的两篇博文《lmkd 机制详解》和《lmkd中adj score的算法剖析》中,根据计算出来的 min_score_adj 选择大于该值的 oom_adj 的进程进行 kill 处理。oom_adj 随着应用状态的不同其值也是伴随着变化的。本文将通过源码剖析 oom_adj 更新的原理。

2023-07-07 20:29:39 1319 1

原创 进程间通信(7)——套接字

进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如:它们都仅限于本地进程间通信。而网络间通信要解决的是不同主机进程间的通信问题(可把同机进程间通信看成一个特例)。同一主机上,不同进程可用进程号(process ID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。

2023-07-07 16:55:14 1296

原创 Android Binder通信原理(八):IPC权限控制

binder 简介servicemanager启动service注册service获取Java 端的service 注册和获取、native下的C-Sjava 下的C-S。本文进一步分析 IPC 下的权限控制。

2023-07-04 10:46:27 770

原创 Android Binder通信原理(七):java 下的C-S

binder 简介servicemanager启动service注册service获取Java 端的service 注册和获取。在前一文中,通过实例,详细地说明了native 下 的C-S 通信原理。本文在之前的基础上,以实例的形式进一步的分析 java 下的 C-S 通信。

2023-06-28 15:12:07 736

原创 Android Binder通信原理(六):native下的C-S

binder 简介servicemanager启动service注册service获取Java 端的service 注册和获取。本文在之前的基础上,以实例的形式进一步的分析 native 下的 C-S 通信。

2023-06-28 14:43:47 864

使用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

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

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

2017-09-05

空空如也

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

TA关注的人

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