概念介绍 什么是slab? slab是slab内存分配器从buddy system申请页面的基本单位。然而slab的大小不是固定的,slab从属于某个kmem cache实例,不同的kmem cache实例,其slab的大小是不同的。slab的大小必须是2^order个pages,order不能超过buddy system所支持的最大的order。 slab内存分配器从buddy system分配...

动态申请内存

内存管理

  

2020-01-13 00:26:22

输出: 引用几张图: 内存分布 程序内存空间(代码段、数据段、堆栈段) 栈、堆辨析:1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。  2、堆区(heap):由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 brk()和sbrk()函数的使用 堆的...

内存管理

内存管理

  

2020-01-20 11:08:00

一、程序的编译链接过程 1、预处理 主要处理一下几个方面内容: ①宏定义    ②文件包含    ③条件编译    ④去掉注释 2、编译 把源代码转换成相应的汇编语言的过程 3、汇编 把汇编语言转换成二进制代码,即目标程序 4、链接 将多个目标程序连同库文件(静态库、动态库)一起...

vma, anon_vma和anon_vma_chain的联系 本文主要参考了vma, anon_vma和anon_vma_chain的联系这篇文章,结合相关资料,对该文进行了一些改进。 Linux提供了内存映射这一特性,它实现了把物理内存页映射(map)到进程的地址空间中, 以实现高效的数据操作或传输。内核在处理这一特性时, 使用了struct vm_area_struct, struct an...

http://www.coder55.com/article/33206 背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 概述 R...

C++ 动态内存管理

内存管理

  

2020-02-19 05:28:41

C语言动态内存管理 C语言为我们提供标准库函数malloc,realloc,calloc和free进行动态内存管理,我们可以先观察一下这三个函数的函数原型: 我们通过简单的使用这些函数来简述这三个函数各自的特性: malloc:一个参数(所开辟空间的大小),返回值为void*,需与free配对使用,防止内存泄漏。 realloc:可用于第一次开辟空间以及调整动态内存,两个参数(所调整空间的起始位置...

前面几节,我们已经看到了x86的分段和分页硬件单元把逻辑地址转换为线性地址,再由线性地址转换到物理地址的基本原理,那么这几张我们来主要是用来学习,内核是怎么实现页表的创建,本章基于imx6ull和qemu来学习整个过程,其主要内容如下: imx6ull支持段映射方式 内核启动主要概述 内核临时页表 1. 段映射方式 在之前页式存储管理中,我们主要是针对x86处理器来描述虚拟地址到物理地址的转换,对...

内存管理(一)

内存管理

  

2020-03-31 03:27:08

当我们new了一个数组,但是我们delete 的时候却没加 [] ,此时会发生内存泄露??? 这个先说明, 这个不一定会发生内存泄露. 当我们申请一个数组时,如果这个类中没有涉及到动态分配过的内存,或者说这个类的析构函数没有写的必要(如 A 类 ). 此时当我们执行 A* apoint = new A[10]; 这条语句后,分配的内存空间图如下: 这个 cokkie 字段就记录了我们申请了 几个 ...

理解堆栈 1.概念   一个由C/C++编译的程序占用的内存分为以下几个部分 栈区:由编译器自动分配释放,存放函数的参数值,局部变量的值等。 堆区:由程序员分配和释放,若程序员不释放,程序结束时可能由OS回收。 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量、未初始化的静态变量在相邻的另一块区域...

(开始这段别人总结的比较好,我就拿来用了) 1.RVA2FOA 即我们现在知道内存状态下的偏移,需要找到文件状态下的偏移。 步骤如下图: step1:内存中的地址减去内存基址得到偏移,即RVA。 step2:循环遍历节表中各个节的信息,判断在哪个节中。(需要满足:内存偏移+节数据没对齐的大小>image_panyi>内存偏移) step3:找出在哪个节后,减去该节在内存中的偏移(Vir...

Linux是为通用的操作系统而设计,为了便于移植需要抽象出一些硬件细节,在驱动代码中看到大量的抽象层的思想。内核中只有和硬件相关的代码才会单独实现,这样做便于移植和添加新硬件。 内核里所有进程和内核线程都共享1GB的地址空间,而每个应用程序对应的进程都有独立的3GB的地址空间,相互不干扰 用户空间:在Linux中,每个用户进程都可以访问4GB的线性地址空间,从0到3GB的虚拟地址空间是用户空间,每...

内存管理是一个很复杂的系统,涉及的内容很多,下图是一个抽象的概述 内存大小 在ARM linux中用dts(dts由powerPC的fdt演变过来)呈现,在ARM vexpress中,内存的定义是在 kernel\linux\v4.4\arch\arm\boot\dts\vexpress-v2p-ca9.dts中,内存的起始地址是0x60000000,大小为0x40000000即1G大小 内核启动...

内存管理二

内存管理

  

2020-05-01 13:38:40

   本文从4个方面进行说明: 1、  Slab的基本原理以及它的文件接口说明 2、  kmalloc、vmalloc、malloc比较 3、  OOM是什么,为什么,怎么做 4、  FAQ:群里经常问到的,也是比较容易误解的问题   slab的基本原理以及它的文件接口说明     &nb...

本篇主要学习以下几个知识点 alloc/reatin/release/dealloc 理解 autorelease 理解 autorelease GUN 实现 autorelease 苹果 实现 原文地址 alloc/reatin/release/dealloc 实现 我们来看看 GUNstep 源代码中 NSObject 类的的 alloc 类方法。 上述调用 NSObject 类的 alloc...