Linux内存管理
文章平均质量分 91
尚先生的博客
这个作者很懒,什么都没留下…
展开
-
valgrind 详解
Valgrind 是一套 Linux 下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind 由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个 CPU 环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。转载 2022-11-24 18:56:09 · 482 阅读 · 0 评论 -
【Linux】Valgrind工具集详解
Valgrind是用于构建动态分析工具的仪器框架。它附带了一组工具,每个工具都执行某种调试,分析或类似任务,可帮助您改进程序。Valgrind的架构采用模块化设计,因此可以轻松创建新工具,而不会干扰现有结构。转载 2022-11-24 18:27:14 · 879 阅读 · 0 评论 -
KASAN实现原理
KASAN是一个动态检测内存错误的工具。转载 2022-11-24 14:02:57 · 507 阅读 · 0 评论 -
虚拟内存精粹
转自今日头条导言虚拟内存是当今计算机系统中最重要的抽象概念之一,它的提出是为了更加有效地管理内存并且降低内存出错的概率。虚拟内存影响着计算机的方方面面,包括硬件设计、文件系统、共享对象和进程/线程调度等等,每一个致力于编写高效且出错概率低的程序的程序员都应该深入学习虚拟内存。本文全面而深入地剖析了虚拟内存的工作原理,帮助读者快速而深刻地理解这个重要的概念。计算机存储器存储器是计算机的核心部件之一,在完全理想的状态下,存储器应该要同时具备以下三种特性:速度足够快:存储器的存取速度应当快转载 2022-05-30 22:29:30 · 149 阅读 · 0 评论 -
malloc的底层实现(ptmalloc)
前言 本文主要介绍了ptmalloc对于内存分配的管理。结合网上的一些文章和个人的理解,对ptmalloc的实现原理做一些总结。内存布局介绍ptmalloc之前,我们先了解一下内存布局,以x86的32位系统为例: 从上图可以看到,栈至顶向下扩展,堆至底向上扩展, mmap 映射区域至顶向下扩展。 mmap 映射区域和堆相对扩展,直至耗尽虚拟地址空间中的剩余区域,这种结构便于 C 运行时库使用 mmap 映射区域和堆进行内存分配。brk(sbrk)和mmap函数首先,linu转载 2022-03-13 21:16:42 · 981 阅读 · 0 评论 -
ptmalloc、tcmalloc与jemalloc对比分析
背景介绍 ptmalloc 系统向看ptmalloc内存管理 用户向看ptmalloc内存管理 线程中内存管理 Chunk说明 问题 tcmalloc 系统向看tcmalloc内存管理 用户向看tcmalloc内存管理 tcmalloc的优势 jemalloc 系统向看jemalloc内存管理 用户向看jemalloc内存管理 jemalloc的优势 总结背景介绍在开发微信看一看期间,为了进行耗时优化,基础库这层按照惯例使用tcmallo转载 2022-03-13 20:51:38 · 2055 阅读 · 0 评论 -
hugepage
0.概述本文总结了hugepage使用过程中的一些知识点,参考的内核版本是4.1.12注:本文为原创,转载请注明出处1.hugepage是什么,有什么用?大页是相对传统4K小页而言的,一般来说常见的体系架构都会提供2种大页大小,比如常见的2M大页和1G大页。其实这两种大页size也分别对应PMD和PUD的一个页表项可以cover的物理内存大小。当然某些体系架构(如arm64)通过contiguous-tlb特性支持2种以上的大页。大页的主要优点:使用大页可以减少页表项数量,从而减少TLB M转载 2021-12-23 12:29:23 · 1111 阅读 · 0 评论 -
slab分配器--Linux内存管理(二十二)
原文链接:https://kernel.blog.csdn.net/article/details/52705552日期 内核版本 架构 作者 GitHub CSDN 2016-09-29 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 2 slab分配器2.1 slab分配器每个C程序员都熟悉malloc, 及其在C标准库中的相关函数. 大多数程序分配若转载 2021-01-20 09:36:49 · 528 阅读 · 0 评论 -
高端内存映射之kmap_atomic固定映射--Linux内存管理(二十一)
原文链接:https://blog.csdn.net/gatieme/article/details/52705178日期 内核版本 架构 作者 GitHub CSDN 2016-09-29 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法.Linux内核转载 2021-01-20 09:36:37 · 489 阅读 · 0 评论 -
高端内存映射之kmap持久内核映射--Linux内存管理(二十)
原文链接:https://blog.csdn.net/gatieme/article/details/52705142日期 内核版本 架构 作者 GitHub CSDN 2016-09-29 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法.Linux内核转载 2021-01-20 09:36:02 · 564 阅读 · 0 评论 -
高端内存映射之vmalloc分配内存中不连续的页--Linux内存管理(十九)
原文链接:https://blog.csdn.net/gatieme/article/details/52705111日期 内核版本 架构 作者 GitHub CSDN 2016-09-29 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法.Linux内核转载 2021-01-20 09:35:48 · 312 阅读 · 0 评论 -
kmalloc分配物理内存与高端内存映射--Linux内存管理(十八)
原文链接:https://blog.csdn.net/gatieme/article/details/52705057日期 内核版本 架构 作者 GitHub CSDN 2016-09-29 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 1 前景回顾1.1 内核映射区尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接转载 2021-01-20 09:35:21 · 1491 阅读 · 0 评论 -
alloc_page分配内存空间--Linux内存管理(十七)
原文链接:https://blog.csdn.net/gatieme/article/details/52704844日期 内核版本 架构 作者 GitHub CSDN 2016-09-29 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 1 前景回顾在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法.转载 2021-01-20 09:34:26 · 865 阅读 · 0 评论 -
伙伴系统之避免碎片--Linux内存管理(十六)
原文链接:https://blog.csdn.net/gatieme/article/details/52694362日期 内核版本 架构 作者 GitHub CSDN 2016-09-28 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 1 前景提要1.1 碎片化问题分页与分段页是信息的物理单位, 分页是为了实现非连续分配, 以便解决内存碎片问转载 2021-01-20 09:33:59 · 545 阅读 · 0 评论 -
伙伴系统之伙伴系统概述--Linux内存管理(十五)
原文链接:https://blog.csdn.net/gatieme/article/details/52420444日期 内核版本 架构 作者 GitHub CSDN 2016-09-02 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 1 前景回顾1.1 Linux内存管理的层次结构Linux把物理内存划分为三个层次来管理层次 描述 存储转载 2021-01-19 16:11:30 · 437 阅读 · 0 评论 -
启动期间的内存管理之pagging_init初始化分页机制--Linux内存管理(十四)
原文链接:https://blog.csdn.net/gatieme/article/details/52403350日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linu转载 2021-01-19 15:25:37 · 419 阅读 · 0 评论 -
启动期间的内存管理之build_zonelists初始化备用内存域列表zonelists--Linux内存管理(十三)
原文链接:https://blog.csdn.net/gatieme/article/details/52403992日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux转载 2021-01-19 15:21:55 · 343 阅读 · 0 评论 -
启动期间的内存管理之bootmem_init初始化内存管理--Linux内存管理(十二)
原文链接:https://kernel.blog.csdn.net/article/details/52403924日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux转载 2021-01-19 15:06:48 · 429 阅读 · 0 评论 -
启动期间的内存管理之memblock分配器--Linux内存管理(十一)
原文链接:https://blog.csdn.net/gatieme/article/details/52403238日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linu转载 2021-01-19 14:38:25 · 627 阅读 · 0 评论 -
启动期间的内存管理之引导分配器bootmem--Linux内存管理(十)
原文链接:https://blog.csdn.net/gatieme/article/details/52403177日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux转载 2021-01-19 14:02:04 · 214 阅读 · 0 评论 -
启动期间的内存管理之初始化过程概述----Linux内存管理(九)
原文链接:https://blog.csdn.net/gatieme/article/details/52403148日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Li.转载 2021-01-19 11:34:36 · 546 阅读 · 0 评论 -
Linux分页机制之分页机制的实现详解--Linux内存管理(八)
原文链接:https://blog.csdn.net/gatieme/article/details/52403013日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 [注意]如果您当前使用的系统并不是linux,或者您的系统中只有一份linux源码,而您又期待能够查看或者检索不同版本的转载 2021-01-19 10:47:23 · 1697 阅读 · 0 评论 -
Linux分页机制之分页机制的演变--Linux内存管理(七)
原文链接:https://blog.csdn.net/gatieme/article/details/52402967日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 1 前景回顾前面我们讲解了操作系统段式存储管理的主要内容. 32位,在保护方式下,其能够访问的线性地址空间可达4GB转载 2021-01-19 10:06:34 · 289 阅读 · 0 评论 -
Linux分页机制之概述--Linux内存管理(六)
原文链接:https://blog.csdn.net/gatieme/article/details/52402861日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 1 分页机制在虚拟内存中,页表是个映射表的概念, 即从进程能理解的线性地址(linear address)映射到存储器上的转载 2021-01-19 09:20:55 · 254 阅读 · 0 评论 -
Linux内存描述之内存页面page--Linux内存管理(四)
原文链接:https://blog.csdn.net/gatieme/article/details/52384636日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 1 前景回顾1.1 UMA和NUMA两种模型共享存储型多处理机有两种模型 均匀存储器存取(Uniform-Mem转载 2021-01-18 16:29:37 · 1003 阅读 · 0 评论 -
Linux内存描述之内存区域zone--Linux内存管理(三)
原文链接:https://blog.csdn.net/gatieme/article/details/52384529日期 内核版本 架构 作者 GitHub CSDN 2016-08-31 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 2017-11-05 最新更新更新了 struct zone 结构体的字段描述, 更详细, 更清晰1 前景回顾转载 2021-01-18 16:06:47 · 300 阅读 · 0 评论 -
Linux内存描述之内存节点node--Linux内存管理(二)
原文链接:https://blog.csdn.net/gatieme/article/details/52384075日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 1 前景回顾前面我们讲到服务器体系(SMP, NUMA, MPP)与共享存储器架构(UMA和NUMA)1.1 UMA和转载 2021-01-18 14:49:45 · 431 阅读 · 0 评论 -
Linux内存描述之概述--Linux内存管理(一)
日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 参照链接 内存管理(一)内存模型之Node Linux 内存管理 重要结构体 Bootmem机制 Linux-2.6.32 NUMA架构之内存和调度 Linux 用户空间与内核空间——高端内存详解 探索 Linux 内存转载 2021-01-18 14:32:49 · 132 阅读 · 0 评论 -
深入理解Linux内存管理-之-目录导航
原文链接:https://kernel.blog.csdn.net/article/details/52384965日期 内核版本 架构 作者 GitHub CSDN 2016-08-31 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 1 内存描述CSDN GitHub Linux内存描述之概述–Linux内存管理(一) 01-descrip转载 2021-01-18 14:17:21 · 154 阅读 · 0 评论 -
linux内存屏障浅析
内存屏障是一个很神奇的东西,之前翻译了linux内核文档memory-barriers.txt,对内存屏障有了一定有理解。现在用自己的方式来整理一下。在我看来,内存屏障主要解决了两个问题:单处理器下的乱序问题和多处理器下的内存同步问题。为什么会乱序现在的CPU一般采用流水线来执行指令。一个指令的执行被分成:取指、译码、访存、执行、写回、等若干个阶段。然后,多条指令可以同时存在于流水线中,同时被执行。指令流水线并不是串行的,并不会因为一个耗时很长的指令在“执行”阶段呆很长时间,而导致后续的指令都卡在“执转载 2021-01-18 13:50:00 · 200 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(七 释放slab)
上一篇回收slab对象时,先考虑放入local cache,当local cache已超过上限时,尝试放入shared cache。否则从local cache中批量释放batch_count对象放入slab三链。当slab三链的空闲对象超过上限,并且待释放的slab对象对应的slab中已经没有正在使用的对象时,将slab直接释放掉。释放slab对应的函数是slab_destroy,下面分析一下。/** * slab_destroy - destroy and release all obje转载 2020-12-12 14:04:41 · 387 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(六 释放对象)
我们的分析顺序是初始化、创建cache、申请对象、申请对象时会涉及创建slab、释放对象、释放对象时会涉及释放slab、销毁cache。前面已经介绍到了创建slab,本节分析一下释放对象,有两个入口kfree和kmem_cache_free,由于两者实现的本质相同只是对外体现为了两个API,这里放在一起梳理一下,下面分析一下代码。/** * kfree - free previously allocated memory * @objp: pointer returned by kmalloc转载 2020-12-12 14:04:32 · 268 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(五 创建slab cache_grow函数)
在前文分析kmalloc时,首先从local cache中获取,没有空闲对象时再从shared local cache中获取,再从slab的三个链表中获取。当链表中也没有空闲对象时,则需要调用cache_grow函数来创建slab了。实际上刚开始创建cache时里面是没有slab对象的,真正使用时才进行slab的创建。下面分析一下cache_grow的实现。/* * Grow (by 1) the number of slabs within a cache. This is called by转载 2020-12-12 14:04:20 · 296 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(四 申请对象 kmem_cache_alloc)
上文分析了普通对象的申请过程,kmalloc。现在看一下针对专用对象的申请kmem_cache_alloc函数。/** * kmem_cache_alloc - Allocate an object * @cachep: The cache to allocate from. * @flags: See kmalloc(). * * Allocate an object from this cache. The flags are only relevant * if the cache转载 2020-12-12 14:04:09 · 513 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(四 申请对象kmalloc)
上篇分析了一下cache的创建过程,现在cache已经创建完成,跟踪一下slab对象的申请过程。目前使用的申请方式主要是kmalloc(从general cache中申请)和kmem_cache_alloc(从专用cache中申请)。先看一下kmallocstatic __always_inline void *kmalloc(size_t size, gfp_t flags){ struct kmem_cache *cachep; void *ret; /* __bu转载 2020-12-12 14:03:59 · 292 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(三 创建cache)
Kernel提供了kmem_cache_create函数用于创建Cache,下面我们直接从API入手。函数有点长,逐行分析一下。/** * kmem_cache_create - Create a cache. * @name: A string which is used in /proc/slabinfo to identify this cache. * @size: The size of objects to be created in this cache. * @align:转载 2020-12-12 14:03:48 · 335 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(二 初始化 kmem_cache_init_late)
start_kernel的在mm_init->kmem_cache_init之后,还调用了kmem_cache_init_late函数。该函数接着kmem_cache_init的处理进度,继续展开,如下:void __init kmem_cache_init_late(void){ struct kmem_cache *cachep; /* 6) resize the head arrays to their final sizes */ /× 之前的函数处理到5)转载 2020-12-11 12:26:21 · 193 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(二 初始化 kmem_cache_init)
初始化的调用过程:start_kernel()->mm_init()->kmem_cache_init(),下面分析一下具体代码。/* * Initialisation. Called after the page allocator have been initialised and * before smp_init(). */void __init kmem_cache_init(void){ size_t left_over; struct cache_转载 2020-12-11 12:26:12 · 349 阅读 · 0 评论 -
Linux内存管理之slab分配器分析(一)
Linux采用了slab来管理小块内存的分配与释放,Slab的提出基于以下两个考虑:1.内核函数经常倾向于反复请求相同的数据类型2.不同的结构使用不同的分配方法可以提高效率3. 伙伴系统的频繁申请/释放影响效率,将释放内存放入缓冲区,直至超过阀值再归还给伙伴系统4. 可以缓解内存碎片的产生,不过产生了内存浪费Slab分为专用高速缓存(用于存放专用数据结构,skb/mm等)和普通高速缓存(普通的kmalloc之类)。所有高速缓存区通过链表组织在一起,首节点是cache_cha...转载 2020-12-11 12:26:02 · 362 阅读 · 0 评论 -
Linux Slab分配器(一)概述
slab分配器是Linux内存管理中非常重要和复杂的一部分,其工作是针对一些经常分配并释放的对象,如进程描述符等,这些对象的大小一般比较小,如果直接采用伙伴系统来进行分配和释放,不仅会造成大量的内碎片,而且处理速度也太慢。而slab分配器是基于对象进行管理的,相同类型的对象归为一类(如进程描述符就是一类),每当要申请这样一个对象,slab分配器就从一个slab列表中分配一个这样大小的单元出去,而当要释放时,将其重新保存在该列表中,而不是直接返回给伙伴系统。slab分配对象时,会使用最近释放的对象内存块,因此转载 2020-12-11 12:25:50 · 353 阅读 · 0 评论