![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
内存管理
文章平均质量分 85
bigDxin
这个作者很懒,什么都没留下…
展开
-
【linux 内存管理】内核态内存相关流程、函数整理
一、start_kernel启动调用start_kernel->setup_arch() build_all_zonelists() mm_init() setup_per_cpu_pageset()以下各函数简介。二、setup_arch()e820处理相关函数,如e820_add_kernel_range()。主要是e820探测物理内存,添加到内核。 max_pfn\max_low_pfn。根据e820探测的物理内存,确定这两个全局变量,用来确定各个zone范围。 me原创 2020-06-15 09:01:12 · 235 阅读 · 0 评论 -
【linux 内存管理】深入linux内核架构 内存管理(4)slab原理
伙伴系统支持按页分配内存,但这个单位太大了。如果需要为一个10个字符的字符串分配空间,分配一个4 KiB或更多空间的完整页面,不仅浪费而且完全不可接受。显然的解决方案是将页拆分为更小的单位,可以容纳大量的小对象。 提供小内存块不是slab分配器的唯一任务。由于结构上的特点,它也用作一个缓存,主要针对经常分配并释放的对象。通过建立slab缓存,内核能够储备一些对象,供...原创 2020-05-28 09:57:27 · 797 阅读 · 0 评论 -
【linux 内存管理】 一些/proc/信息
1、/proc/meminfomemtotal:这个对应全局变量totalram_pages,系统出了内核代码段、数据段、memblock.reserved等的内存外一共系统可管理的内存。memfree:表示系统尚未使用的内存。[MemTotal-MemFree]就是已被用掉的内存.memavailable:有些应用程序会根据系统的可用内存大小自动调整内存申请的多少,所以需要...原创 2020-05-28 09:58:03 · 266 阅读 · 0 评论 -
【linux 内存管理】 关键的全局变量
1、max_pfn:调用栈:setup_arch(): max_pfn = e820__end_of_ram_pfn();e820__end_of_ram_pfn()函数时找到e820探测的最大的物理地址区间(RAM的即usable)的物理地址所在的页帧号与该架构支持的最大帧号的最大值。如:2、max_low_pfnsetup_arch(): ma...原创 2020-05-28 09:57:06 · 768 阅读 · 0 评论 -
【linux 内存管理】memblock算法简单梳理
最近看了一份博客介绍memblock的算法实现,整理下温故而知新。引:http://blog.chinaunix.net/uid-26859697-id-4498257.htmlmemblock算法是linux内核初始化阶段的一个内存分配器(它取代了原来的bootmem算法),实现较为简单。负责page allocator初始化之前的内存管理和分配请求。 分析memblock算法...原创 2020-05-28 09:57:17 · 1289 阅读 · 1 评论 -
【linux 内存管理】预留内存、大块内存申请cblock
内核对于有申请100M、200M大内存的连续地址时,如果基于伙伴系统分配是不太可行的,首先伙伴系统最大支持11阶即即8M的内存,即使调整最大阶数,内核在初始化伙伴系统是也不能有存在多个大阶内存,如果被分配或者裂变后再申请就有可能申请不到。所以有个方案就是将内存预留出来,比如8g预留出4g,专门用于大块内存申请,cblock就是实现的这个方案。...原创 2020-05-28 09:56:47 · 1778 阅读 · 3 评论 -
【linux 内存管理】深入理解linux内核架构 内存管理(5)vmalloc
一、内核中不连续页的分配 我们知道物理上连续的映射对内核是最好的,但并不总能成功地使用。在分配一大块内存时,可能竭尽全力也无法找到连续的内存块。在用户空间中这不是问题,因为普通进程设计为使用处理器的分页机制,当然这会降低速度并占用TLB。在内核中也可以使用同样的技术。内核分配了其虚拟地址空间的一部分,用于建立连续映射。 每个vmalloc分配的子区域都是自包含的,与其...原创 2020-05-28 09:56:37 · 436 阅读 · 0 评论 -
【linux 内存管理】深入理解linux内核架构 内存管理(3)伙伴系统
在内核初始化完成后,内存管理的责任由伙伴系统承担。伙伴系统基于一种相对简单然而令人吃惊的强大算法,已经伴随我们几乎40年。它结合了优秀内存分配器的两个关键特征:速度和效率。一、伙伴系统结构系统内存中的每个物理内存页(页帧),都对应于一个struct page实例。每个内存域都关联了一个struct zone的实例,其中保存了用于管理伙伴数据的主要数组。<mmzone...原创 2020-05-28 09:56:26 · 916 阅读 · 0 评论 -
【linux 内存管理】深入理解linux内核架构 内存管理(2)build_all_zonelists、内存布局
一、内存管理初始化各函数功能介绍:1、结点和备用内存域初始化build_all_zonelists建立管理结点及其内存域所需的数据结构。start_kernel->build_all_zonelists(NULL,NULL)->build_all_zonelists_init()->__build_all_zonelists(NULL)...原创 2020-05-28 09:56:17 · 614 阅读 · 0 评论 -
【linux 内存管理】zone初始化
zone初始化调用:zone_sizes_init->free_area_init_nodesfree_area_init_nodes()的参数max_zone_pfns是一个数组,pfn(page frame num),其实就是标识了各个内存域的起始页帧(页框)标号。ZONE_DMA之前还有大约1M的内存是留给bootloader的。通过这个也可以计算出各个内存域的大小。v...原创 2020-05-28 09:55:47 · 1055 阅读 · 0 评论 -
【linux 内存管理】深入理解linux内核架构 内存管理(1)
一、UMA,一致性内存访问(uniform memory access),将可用内存以连续方式组织起来。SMP系统的每个处理器访问的都是同一个内存区。NUMA,非一致性内存访问,总是多处理器计算机。系统各个CPU都有本地内存,可支持特别快速的访问。各个处理器之间通过总线连接起来,一支持对其他CPU的本地内存的访问,当然比访问本地内存要慢一些。二、NUMA内存组织...原创 2020-05-28 09:56:08 · 469 阅读 · 0 评论 -
【linux 内存管理】杂七杂八
CPU硬件高速缓存:根据https://blog.csdn.net/gatieme/article/details/52384075和https://www.cnblogs.com/tolimit/p/4551428.html,物理内存初始化的层次结构,物理内存分配为多个node节点,每个node节点管理多个zone区(zone包含NORMAL、DMA、HIGHMEM等),每个zone又通过伙...原创 2020-05-28 09:59:05 · 111 阅读 · 0 评论 -
【linux 内存管理】内存寻址
一、内存地址对于80x86微处理器,我们需要区分以下地址:逻辑地址:这种寻址方式是x86才有的著名的分段结构,每一个逻辑地址都是由一个段和偏移量组成,偏移量指明了从段开始的地方实际地址之间的距离。线性地址(也称虚拟地址):是一个32位无符号数,0x00000000~0xffffffff物理地址:用于内存芯片级别内存寻址。他们从微处理器的地址引脚发送到内存总线上的电信号相对对应。...原创 2020-05-28 09:59:57 · 245 阅读 · 0 评论 -
【linux 内存管理】 linux内核设计与实现
部分转载自原文链接:https://blog.csdn.net/u010521366/article/details/89204616页(物理页):内核把物理页作为内存管理的最小单位,用struct page结构体表示系统的每个物理页:flag用来存放页的状态,包括这个页是不是脏的,是不是被锁定在内存中,它至少可以同时表示32种不同的状态。count存放页的引用计数,通常用page...原创 2020-05-28 09:55:59 · 180 阅读 · 0 评论