Linux 内存学习笔记
文章平均质量分 77
主要沿着自己的职业生涯轨迹,一路下沉到底层软件,提高自己的地软开发能力和对操作系统的认识。
优惠券已抵扣
余额抵扣
还需支付
¥39.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
零纳秒科技
校园到职场,做过室内设计;WEB前后端,APP,嵌入式,LinuxAndroid,ChromiumOS,YunOS,智舱OS等开发。
行业遍及互联网,手机,IOT,汽车。
合作品牌如华为,中兴,OV,小米,三星,谷歌,联想,诺基亚,魅族,上汽,大众,腾讯,百度,网易,LG、HTC,沃达丰,AT&T,中移动,中国电信。
职业规划为操作系统方向,涉及不同框架、方案架构设计开发,可维可测,全维度的工程化;
目前主要涉及Android产品从App、FWK、HAL、Kernel、QNX全链路的垂直工程化,以及跨域产/研/测/项目/互联网产品的横向工程化;
展开
-
Linux内存从0到1学习笔记(8.20 ION使用(三))-- 更新中
通过前面的介绍,我们知道ION buffer由系统内存分配,通常用于存储从 DMA buffer 复制的图像数据。原创 2024-07-25 23:07:34 · 148 阅读 · 0 评论 -
Linux内存从0到1学习笔记(8.20 ION简介(二))
类似于其 PMEM身,ION 管理一个或多个内存池,其中一些在启动时被预留,以对抗碎片化或满足特殊硬件需求。GPU、显示控制器和相机是一些可能具有特殊内存需求的硬件模块。ION 将其内存池呈现为 ION 堆。每种类型的 Android 设备可以根据其内存需求配置不同的 ION 堆。简而言之,allocate() 和 free() 从堆中获取或释放一个 ion_buffer 对象。调用 phys() 将返回缓冲区的物理地址和长度,但仅适用于物理上连续的缓冲区。原创 2024-07-19 22:26:50 · 327 阅读 · 0 评论 -
Linux内存从0到1学习笔记(8.19 ION 简介(一))
ION(Interprocess Communication Over Non-Contiguous Memory)即“跨进程非连续内存通信”。是Android系统中负责内存管理的关键子系统,由 Google 在 Android 4.0 ICS 中引入,旨在解决当时 Android 设备中存在的多样化内存管理机制所带来的问题,也就是用归一化的思想来解决不同 Android 设备上内存管理接口分散的问题。举个例子,在使用 NVIDIA Tegra 的 Android 设备上,有 "NVMAP";原创 2024-07-16 23:28:57 · 1564 阅读 · 0 评论 -
Linux内存从0到1学习笔记(8.17 SMMU Fault调试方法)
通过前面的介绍,我们知道了SMMU实际上是一个针对外设的MMU。它作为一个硬件IP被设备执行DMA操作时使用。再来简单回顾下SMMU的工作流程:外设 ---> DMA操作 ---> SMMU ---> Memory也就是说,通常情况下驱动程序会先分配DMA Buffer ---> 然后执行SMMU映射,并得到IOVA ---> 驱动在设置IOVA到设备(也就是告诉设备Buffer的位置) ---> 设备驱动开始执行DMA操作 ---> 设备通过SMMU访问分配的DMA Buffer。原创 2024-06-22 08:11:03 · 356 阅读 · 0 评论 -
Linux内存从0到1学习笔记(8.16 SMMU详解)
本文基于QCOM平台的SoC进行拆解。在QCOM平台下,SMMU作为一个子系统负责将虚拟地址转换为物理地址并检查访问权限。SMMU在SoC中执行两个主要功能:内存碎片整理(使用虚拟内存)和访问控制。QSMMU为ARM CPU Cluster提供了一个符合Arm V8的硬件接口。以QSMMU V500为例,首先QSMMU V500是基于armmmu-500客制化的smmu-v2实现。TBU或QTB 转换缓冲单元(QTB实际上指Qcom平台的TBU)。原创 2024-06-14 23:03:26 · 245 阅读 · 0 评论 -
Linux内存从0到1学习笔记(8.15 MMU/IOMMU/SMMU概览)
IOMMU(input/output memory management unit 输入/输出内存管理单元)是一个更广泛的概念,用于多种架构(包括x86/x64和ARM),其原理与CPU中的MMU相似,管理设备的内存访问请求,实现地址转换和内存保护。它的主要作用之一是控制设备DMA(Direct Memory Access)地址到机器物理地址的映射。这种映射确保了设备能够安全地访问物理内存区域。因为在没有IOMMU的情况下,设备通过DMA可以访问机器的全部地址空间,这可能会带来安全风险。原创 2024-06-14 22:44:42 · 353 阅读 · 0 评论 -
Linux内存从0到1学习笔记(6.13 libc库对内存管理之ptmalloc)--- 更新中
今天介绍的ptmalloc其实是指GNU libc中默认的内存分配器,目前普遍使用的ptmalloc实际上是基于早期malloc(dlmalloc)的基础上演进而来。相对于dlmalloc,ptmalloc增加了动态分配去(dynamic arena)每一个分配区利用互斥锁(mutex)使线程对于该分配区的访问互斥。进程可以是单线程,也可以是多线程,因此每个就进程可以有一个主分配区和多个线程分配区。原创 2023-05-15 22:55:52 · 3677 阅读 · 0 评论 -
Linux内存从0到1学习笔记(6.12 应用程序是如何申请内存的呢?)
前面提到了应用程序大多基于glibc的malloc/free进行内存的分配。这里不讨论共享内存,因为共享内存都是预先分配好的,所以由共享内存mmap和shm所设计的内存泄漏比较少见。接下来我们从应用调用的维度来看下,应用程序都有哪些调用入口,以及它们是如何申请和释放内存的。原创 2023-05-08 22:02:52 · 3732 阅读 · 0 评论 -
Linux内存从0到1学习笔记(6.11内存管理总结)
我们常说的内存优化常常要进行分层优化,且应用程序的优化是我们的主要战场。这里的分层优化分别指应用程序层,和中间层(libc.so),内核层。原创 2023-05-03 22:18:36 · 3364 阅读 · 0 评论 -
Linux内存从0到1学习笔记(11.2 内存优化方案之内存压缩zram)
zram是Linux内核提供的一种虚拟内存压缩功能,通过在将一部分内存模拟成块设备,并将压缩后的内存写到这部分模拟的块设备中,直到必须使用硬盘上的交换空间,zram 本质是就是一个块设备。原创 2022-05-08 22:27:15 · 7822 阅读 · 0 评论 -
Linux内存从0到1学习笔记(10.1 BugsShooter之cma配置过小导致页迁移繁忙而内存申请失败)
通过向武神讨教,顺便记录cma内存有空间但页繁忙(页正被访问,无法迁移)迁移不了导致cma内存分配失败的排查过程。原创 2022-05-06 21:49:11 · 7737 阅读 · 0 评论 -
Linux内存从0到1学习笔记(9.10 内存优化调试之panic_on_oom介绍
通过配置/proc/sys/vm/panic_on_oom文件节点可以使能或禁用out-of-memory的panic原创 2022-09-13 07:40:53 · 5625 阅读 · 0 评论 -
Linux内存从0到1学习笔记(9.9 内存优化调试之oom_kill触发机制)
Out Of Memory Killer或OOM Killer是内核中一种用于在系统内存紧张的情况下,防止内存耗尽并自动查杀进程的机制。原创 2022-04-26 10:46:16 · 6488 阅读 · 0 评论 -
Linux内存从0到1学习笔记(9.7 内存优化调试之page_owner内存分配堆栈详解)
前面已经介绍了开启内核page owner功能的方法,以及如何对page owner信息进行排序,解析。最终可以确认那些任务或进程占用了多少内存。无论是正常分配的,还是内存黑洞的内存,我们都可以通过解析page owner拆分出来。那么接下来我们对page owner中的内存分配堆栈进行一个详细的介绍和分析。以帮助我们建立内存分配、回收的基础知识。工具大家都会用,但是其背后的原理我们还是要仔细打磨下的。原创 2022-05-10 22:17:08 · 6215 阅读 · 0 评论 -
Linux内存从0到1学习笔记(9.6,内存优化调试之page_owner拆解)
page owner用于跟踪每个页面的分配细节。如上图,当有内存被分配时,内存分配调用栈、进程ID、分配时间、掩码信息等都会被记录下来。原创 2022-05-09 15:01:16 · 7279 阅读 · 2 评论 -
Linux内存从0到1学习笔记(9.5,内存优化调试之记录pid到page_owner)
在一些比较高的内核版本中其实已经默认支持,但一些vendor还不支持记录pid的page_owner。Liam Mark已经2020-12-14的时候提交了相关的path。原创 2022-04-25 15:29:04 · 5937 阅读 · 0 评论 -
Linux内存从0到1学习笔记(9.4,内存优化调试之使用page_owner分析内存黑洞)
PageOwner用于跟踪每个内存页被谁分配走了。它可以用来分析内存泄漏,找出内存占用者后者。当分配内存时,分配的调用栈信息和内存页顺序会为每个内存页保存下来。当我们需要了解所有内存页的状态时,我们可以读取这些节点信息来分析内存分配的详细细节。原创 2022-04-23 14:16:03 · 6974 阅读 · 0 评论 -
Linux内存从0到1学习笔记(9.3,内存优化调试之内存拆解)
我们在日常的工作当中需要各种手段来调试内存,尤其是在内存泄漏的情况下,我们需要一种手段来统计内存的使用去向,以确定内存使用不合理的方向。或者物理内存有限的情况下,需要对内存进行优化,也需要通过一些手段达到对内存的拆解。原创 2022-04-21 23:01:39 · 6136 阅读 · 0 评论 -
Linux内存从0到1学习笔记(9.2,内存优化调试之DMA/CMA拆解)
DMA是一种无需CPU参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而提高系统的吞吐率。DMA通常与硬件体系结构,特别是外设的总线技术密切相关。原创 2022-04-20 09:42:18 · 6909 阅读 · 0 评论 -
Linux内存从0到1学习笔记(9.1,内存优化调试之kswapd0触发原理)
Linux内核中有一个非常重要的内核线程kswapd,它负责在内存不足时回收页面。kswapd内核线程初始化时会为系统中每个内存结点创建一个名为“kswapd%"内核线程。对于UMA架构下常常是kswapd0线程。因此我们可以把kswapd0看作是系统的虚拟内存管理程序,如果物理内存不够用,系统就会唤醒 kswapd0 进程。但是需要特别注意的是,由于kswapd0分配磁盘交换空间作缓存,因此会占用大量的CPU资源。原创 2022-04-19 16:07:50 · 6868 阅读 · 0 评论 -
Linux内存从0到1学习笔记(8.14 dma-buf内存调试二 bufinfo介绍)-- 更新中
bufinfo是我们调试dmabuf使用的一个非常有效的debug 信息。因此我们需要了解下它的由来以及记录的关键信息。并且根据场景需要来对跟踪的信息进行调整和完善,以满足我们的调试需要。原创 2023-01-11 22:23:48 · 4501 阅读 · 0 评论 -
Linux内存从0到1学习笔记(8.13 dma内存调试一)
现在我们对dma-buf几个紧密关联的结构体有所了解,再结合相应的导入器,导出器使用示例,dma-buf的使用已经不再陌生。那么在日常使用过程中常常会遇到哪些问题呢?原创 2023-01-02 21:04:18 · 4268 阅读 · 0 评论 -
Linux内存从0到1学习笔记(8.12 dma-buf导出器和导入器使用示例 四)
前面解释了使用dma_buf所涉及的几个重要的结构体以及导出器的示例,我们再来介绍下导入器具体示例。原创 2022-12-28 21:09:18 · 9698 阅读 · 2 评论 -
Linux内存从0到1学习笔记(8.12 dma-buf导出器和导入器使用示例 三)
前面解释了使用dma_buf所涉及的几个重要的结构体,今天我们来介绍下dma_buf使用的具体示例。原创 2022-12-28 19:32:45 · 7755 阅读 · 1 评论 -
Linux内存从0到1学习笔记(8.11 dma-buf导出器和导入器使用示例 二)
除了前面介绍的非常重要的导出器操作管理结构体dma_buf_ops,我们再来了解下设备缓冲区的附着数据(attachment data)的结构体以及共享缓冲区对象的构成结构体dma_buf。原创 2022-12-28 11:08:24 · 5716 阅读 · 1 评论 -
Linux内存从0到1学习笔记(8.10 dma-buf导出器和导入器使用示例 一)
前面的博客提到过,dma-buf的使用包括导出器(exporter)和导入器(importer),导出器需要实现并管理dma_buf_ops中定义的操作,而导入器的操作由结构体dma_buf_attachment来提供。原创 2022-12-20 22:29:04 · 4401 阅读 · 1 评论 -
Linux内存从0到1学习笔记(8.9 可恢复硬件页面错误的含义)
现代硬件支持可恢复的页错误,这对DMA围栏有很多影响。原创 2022-12-18 19:56:39 · 3613 阅读 · 0 评论 -
Linux内存从0到1学习笔记(8.8 无限DMA Fence)
在不同时间,结构体dma_fence具有无限期的时间,直到dma_fence_wait()执行完成。原创 2022-12-17 22:08:13 · 3991 阅读 · 0 评论 -
Linux内存从0到1学习笔记(8.7 DMA-BUF代码解读)
dma-buf代码解读原创 2022-12-17 08:03:40 · 4209 阅读 · 0 评论 -
Linux内存从0到1学习笔记(8.6 DMA-BUF简介)
CPU指令系统通常只支持CPU(寄存器)-存储器,以及CPU-外设之间的数据传送,那么如果外设需要和存储器进行数据交换就必须经过CPU寄存器进行中转。很显然,中转会大大降低CPU的工作效率,浪费时间。因此,需要在外设和存储器之间开辟一个直接数据传输通道。如果这个通道的数据传输有其他硬件来完成,既可以加快传输效率,又可以减轻CPU对I/O的负载。原创 2022-12-12 21:58:47 · 4472 阅读 · 0 评论 -
Linux内存从0到1学习笔记(8.5,CMA内存分配)
CMA是通过cma_alloc分配的。cma_alloc() --> alloc_contig_range(...,MIGRATE_CMA,...),向刚才释放给buddy system的MIGRATE_CMA类型页面,重新“收集”过来。原创 2022-04-27 17:49:26 · 6081 阅读 · 0 评论 -
Linux内存从0到1学习笔记(7.3,用户空间虚拟内存之内存映射)
C库函数提供了mmap函数建立映射。在内核一端,提供了两个系统调用mmap和mmap2.通常C标准库只提供了一个函数,由应用程序用来创建内存映射,接下来该函数调用在内部转换为适合于体系结构的系统调用mmap和mmap2。可使用munmap系统调用删除映射。原创 2022-04-17 11:57:46 · 6356 阅读 · 0 评论 -
Linux内存从0到1学习笔记(7.2,用户空间虚拟内存之内存空间的建立)
在使用load_elf_binary装在一个ELF二进制文件时,将创建进程的地址空间。Linux下的exec系统调用该函数来加载ELF文件。原创 2022-04-17 11:42:32 · 5995 阅读 · 0 评论 -
Linux内存从0到1学习笔记(7.1,用户空间虚拟内存之用户虚拟内存简介)
用户虚拟内存向每个用户空间进程提供相同的系统视图。多个进程可以同时运行且不会相互影响其他进程内存中的内容。用户空间虚拟地址值得就是进程虚拟地址。原创 2022-04-15 23:27:13 · 5823 阅读 · 0 评论 -
Linux内存从0到1学习笔记(6.10 物理内存初始化之vmalloc分配器)
前面有提到,kmalloc()是基于slab分配器的接口函数,slab缓冲区建立在一个物理地址连续的大内存块之上,所以其缓存对象页是物理地址连续的。如果在内核中不需要连续的物理地址,而仅仅需要内核空间的虚拟地址是连续的内存块,就需要vmalloc()函数了。原创 2022-05-07 12:49:23 · 5620 阅读 · 0 评论 -
Linux内存从0到1学习笔记(6.9,物理内存初始化之Slab分配器)
前面提到了伙伴系统初始化,我们知道伙伴系统是以页(≥4KB)为单位进行管理的。但在内核中,有些时候需要申请更小字节单位的内存。slab由此而生...slab基于伙伴系统的以字节为单位进行管理的内存分配器。它首先从Buddy系统申请内存,然后再对这部分申请到的内存进行细分化管理。原创 2022-05-07 11:01:45 · 5441 阅读 · 0 评论 -
Linux内存从0到1学习笔记(6.8,物理内存初始化之buddy伙伴系统)
在linux启动的那一刻,内存管理就已经开始了。原创 2022-04-14 23:06:42 · 6045 阅读 · 2 评论 -
Linux内存从0到1学习笔记(6.7,物理内存初始化之CMA初始化)
CMA (contiguous memory allocator)连续内存分配器,被开发用于分配大的、物理连续的内存块,其底层还是依赖内核伙伴系统这样的内存管理机制。通过这套机制,在设备驱动不用时,内存管理系统将该区域用于分配和管理可移动类型页面;设备驱动使用时,用于连续内存分配,此时已经分配的页面需要进行迁移;只有当需要的时候才会被分配给Camera,HDMI等设备。CMA常常和DMA子系统集成在一起使用,对上呈现的接口是标准的DMA,也是一致性缓冲区API(dma_alloc_coherent())。实原创 2022-04-27 17:04:27 · 6779 阅读 · 0 评论 -
Linux内存从0到1学习笔记(6.6,物理内存初始化之预留内存)
前面的章节中有提到过,memblock分配器会将内存划分为动态管理的内存(保存在memblock的memory type的数组)和静态预留的内存(保存在memblock的reserved type的数组)。原创 2022-04-26 22:50:20 · 6429 阅读 · 0 评论 -
Linux内存从0到1学习笔记(6.5,物理内存初始化之物理内存管理数据结构)
在BootLoader阶段,内存设备的初始化就已经完成。随后把DDR设备容量大小传递给内核。Linux内核的管理实际上是对如内存节点(pglist_data)、内存管理区(zone),虚拟内存页(page),mem_map[]数组,页表项(PTE),物理内存页框号(PFN),物理地址(paddress)等数据结构的管理。那么接下来我们把前面物理内存初始化过程中所遇到的数据结构,以及数据结构之间的关系进行一个简答的梳理。关于虚拟内存数据结构的VMA,mm_struct,vaddr等,后面调查虚拟内存的时候再总原创 2022-04-14 14:31:57 · 5843 阅读 · 0 评论