内存管理
Linux 内存管理
爱洋葱
One battle, one person
展开
-
Linux 内存管理窥探(16):页面回收 (LRU)
目录1. 页面的使用2. 为什么要进行页面回收3. 哪些页面可以被回收4. 进行页面回收的时机5. 页面回收算法5.1 LRU 链表5.2 如何在两个 LRU 链表之间移动页面5.3 LRU 缓存5.4 回收过程 LRU 的扫描5.5 页面回收的实现5.5.1 函数 shrink_zone()5.5.2函数 shrink_slab()6. 反向...转载 2019-06-24 22:07:38 · 4849 阅读 · 2 评论 -
Linux 内存管理窥探(10.5):内存初始化(图解)
根据前面几篇文章,Linux 内存初始化流程大致的流程为1,DTS 获取内存大小2,清除映射表,并完成 Kernel 和 Low memory 的映射3,完成内容管理相关的结构初始化,pg_data, zone 以及 page4,zonelist 挂相关的分配逻辑5,完成伙伴系统初始化大致图为:...原创 2019-06-06 00:16:26 · 959 阅读 · 0 评论 -
Linux 内存管理窥探(15):虚拟内存 VMA 浅析
在32位的系统上,线性地址空间可达到4GB,这4GB一般按照3:1的比例进行分配,也就是说用户进程享有前3GB线性地址空间,而内核独享最后1GB线性地址空间。由于虚拟内存的引入,每个进程都可拥有3GB的虚拟内存,并且用户进程之间的地址空间是互不可见、互不影响的,也就是说即使两个进程对同一个地址进行操作,也不会产生问题。在前面介绍的一些分配内存的途径中,无论是伙伴系统中分配页的函数,还是slab分配...转载 2019-04-24 20:22:55 · 7282 阅读 · 0 评论 -
Linux 内存管理窥探(14):Slab 分配器
转至:https://blog.csdn.net/gatieme/article/details/52705552感谢原文作者的无私分享1 slab分配器1.1 slab分配器每个C程序员都熟悉malloc, 及其在C标准库中的相关函数. 大多数程序分配若干字节内存时. 经常会调用这些函数.内核也必须经常分配内存, 但无法借助于标准库的函数. 上面描述的伙伴系统支持按...转载 2019-04-18 22:36:29 · 1169 阅读 · 0 评论 -
Linux 内存管理窥探(13):伙伴系统(分配内存)
在伙伴系统完成了初始化(将内存的按照 order 添加到 zonelist 后),就可以利用伙伴系统进行分配内存了。首先我们看看伙伴系统提供的内存分配函数:内存分配函数 功能 alloc_pages(mask, order) 分配2^order页并返回一个struct page的实例,表示分配的内存块的起始页 alloc_page(mask) 是前者在order ...原创 2019-04-17 21:18:27 · 1426 阅读 · 0 评论 -
Linux 内存管理窥探(11):伙伴系统(概述)
Linux 系统启动过程中使用 memblock 进行内存的简单管理,到了后期,初始化内存完毕后,使用大名鼎鼎的 Buddy System 来进行内存管理(分配/释放回收)伙伴系统概述伙伴系统是一个结合了2的方幂个分配器和空闲缓冲区合并计技术的内存分配方案, 其基本思想很简单. 内存被分成含有很多页面的大块, 每一块都是2个页面大小的方幂. 如果找不到想要的块, 一个大块会被分成两部...转载 2019-04-11 12:00:47 · 1739 阅读 · 0 评论 -
Linux 内存管理窥探(12):伙伴系统(初始化)
由于伙伴系统需要使用到 zone 和 zonelist 结构,所以伙伴系统的初始化和 zone & zonelist 关系密切。这里我们回顾一下 zone 和 zonelist 的结构。zone 是用来表示 Linux 对内存的区域划分的结构,一般的,物理内存会被划分成为 ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM 区域。我们先来回顾一下 zone 的数据结...原创 2019-04-11 17:04:43 · 1766 阅读 · 0 评论 -
Linux 内存管理窥探(10):内存初始化(创建页表映射 create_mapping)
在内存的初始化阶段,在初始化页表后,调用相关的函数来创建映射:start_kernel() --> setup_arch() --> paging_init() --> map_lowmem() --> create_mapping()也就是说,在系统初始化的时候呢,已经根据系统的内存情况,建立好了所有低端内存的映射表,后续伙伴系统分配的内存便可以直接使用啦!!...原创 2019-04-01 13:49:07 · 3386 阅读 · 1 评论 -
Linux 内存管理窥探(9):内存初始化(bootmem_init)
参考文档:https://github.com/gatieme/LDD-LinuxDeviceDrivers/tree/master/study/kernel/02-memory/03-initialize/04-bootmem_init感谢作者的无私分享。我们住关注start_kernel中关于内存管理的部分总览:asmlinkage __visible void __in...转载 2019-03-23 01:21:41 · 1565 阅读 · 0 评论 -
Linux 内存管理窥探(8):内存初始化(paging_init)
参考文档:https://github.com/gatieme/LDD-LinuxDeviceDrivers/tree/master/study/kernel/02-memory/03-initialize/04-bootmem_init感谢作者的无私分享。我们住关注 start_kernel 中关于内存管理的部分总览:asmlinkage __visible void __i...原创 2019-03-19 05:00:02 · 1963 阅读 · 0 评论 -
Linux 内存管理窥探(7):内存初始化(memblock)
参考文档:https://blog.csdn.net/gatieme/article/details/52403148 感谢作者的无私分享Linux 的 C 代码的开始主要关注 start_kernel 函数,这是整个系统开始初始化的入口。其实 start_kernel 函数的内容是非常的多的,这里先只关注内存管理部分的代码。asmlinkage __visible void __in...转载 2019-03-15 00:47:50 · 2518 阅读 · 0 评论 -
Linux 内存管理窥探(6):分页机制
参考文档:https://blog.csdn.net/gatieme/article/details/52402861感谢作者的无私分享。在前面的内容了解到硬件为了支持虚拟地址和物理地址,引入了硬件的 MMU 管理。分页机制其实是硬件和操作系统软件共同作用的产物,硬件需要支持虚拟地址到物理地址的转换,软件需要设计一种方式来兼容所有的处理器的这种机制,所以就诞生了这种 VA -> P...转载 2019-02-28 17:15:53 · 1137 阅读 · 0 评论 -
Linux 内存管理窥探(5):page 数据结构
本文参考:https://blog.csdn.net/gatieme/article/details/52384636 感谢作者无私的奉献 前面聊过内存的表示由 node -> zone -> page ,聊聊 page 结构。内核把物理页作为内存管理的基本单位. 尽管处理器的最小可寻址单位通常是字, 但是, 内存管理单元MMU通常以页为单位进行处理. 因此,从虚拟内存的上...转载 2019-02-12 15:30:31 · 10591 阅读 · 0 评论 -
Linux 内存管理窥探(4):zone 数据结构
本文来自,https://blog.csdn.net/gatieme/article/details/52384529,感谢作者的无私分享。 前面章节的了解,zone 结构是物理内存管理中 node 管理的物理内存区域,也就是 struct zone 结构体,这里来分析这个结构体:内存节点又被划分为内存管理区域, 一个管理区域通过 struct zone 描述, 用以表示内存的某个范围...转载 2019-02-01 17:54:39 · 4142 阅读 · 0 评论 -
Linux 内存管理窥探(3):node 数据结构
内存节点的结构描述本文参考:https://blog.csdn.net/gatieme/article/details/52384075 感谢作者无私的奉献前面章节的了解,node 结构是物理内存管理中最顶层的存在,也就是 pg_data_t 结构体,这里来分析这个结构体:这个结构体定义在 include/linux/mmzone.h 中/* * The pg_data_t s...转载 2019-01-31 23:59:46 · 1473 阅读 · 0 评论 -
Linux 内存管理窥探(2):内存模型
讨论内存的模型之前需要先聊一下两种计算机架构:UMA 和 NUMAUMA 称为均匀存储器存取(Uniform-Memory-Access) :物理存储器被所有处理机均匀共享。所有处理机对所有存储字具有相同的存取时间,这就是为什么称它为均匀存储器存取的原因。每台处理机可以有私用高速缓存,外围设备也以一定形式共享。NUMA 非均匀存储器存取(Nonuniform-Memory-Acces...原创 2019-01-31 15:35:29 · 2046 阅读 · 5 评论 -
Linux 内存管理窥探(1):内存规划与分布
懂水的小伙伴都知道 Linux 地址组成有虚拟地址和物理地址,早在单片机时代,咱们都是直接访问物理内存,以及统一编址的外设,使用的都是实地址模式,也就是物理地址。物理地址,就是实实在在的物理上的内存地址。后面随着计算机的发展,为了更好的分层以及更好的管理应用程序,出现了虚拟地址的概念,虚拟地址是什么意思呢?虚拟地址不是实实在在的物理地址,但是他和实际的物理地址有一个对应关系。由于多道程序的出现,每...原创 2019-01-30 18:12:01 · 2864 阅读 · 0 评论