![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
内存管理
在hust快乐的学习
希望通过CSDN这个平台认识更多志同道合的朋友!
实现共同进步!
展开
-
boot memory allocator——自举内存分配器(二:在IA-32系统下的初始化)
bootmem分配器的初始化时一个特定于体系结构的过程,此外还取决于所述计算机的内存布局,在IA-32系统下使用setup_memory,该函数又调用setup_bootmem_allocator来初始化bootmem分配器,如下所示的代码流程图说明了IA-32系统上初始化bootmem分配器涉及的各个步骤。static void __init setup_memory(void)原创 2012-08-16 15:04:31 · 2365 阅读 · 0 评论 -
linux内存管理伙伴算法(一:基本概念介绍)
在系统初始化进行到伙伴系统分配器能够承担内存管理的责任后,必须停用bootmem分配器,毕竟不能同时用两个分配器管理内存。在UMA和NUMA系统上,停用分别由free_all_bootmem和free_all_bootmem_node完成(前面的博客已经详细讨论过)。伙伴系统基于一种相对简单而令人吃惊的强大算法,它结合了优秀内存分配器的两个关键特性:速度和效率。Linux内核中采用了一种同时适用于原创 2012-08-21 15:23:05 · 4864 阅读 · 1 评论 -
Linux内存管理中内存的组织及主要数据结构分析(pg_data_t&&page&&zone)
在讲解内核中用于组织内存的数据结构之前,考虑到术语不总是容易理解,所以先来看看几个概念。我们首先考虑NUMA系统,这样,在UMA系统上介绍这些概念就非常容易了。下图给出内存划分的图示:首先,内核划分为结点。每个结点关联到系统中的一个处理器,在内核中表示为pa_data_t的实例(稍后定义该数据结构)。各个结点又划分为内存域,是内存的进一步细分。例如,对可用于(ISA设备的)DMA操原创 2012-08-20 19:30:39 · 5169 阅读 · 0 评论 -
linux内存伙伴算法(四:释放页)
__free_pages源代码详细分析如下:fastcall void __free_pages(struct page *page, unsigned int order){ if (put_page_testzero(page)) {//一般来说,只有当页面的引用计数变为0时,才会释放该页,此处进行页面引用计数的判断 if (order == 0)//如果是释放单个页面,则释放原创 2012-09-07 10:43:31 · 2544 阅读 · 0 评论 -
boot memory allocator——自举内存分配器(一:基本介绍)
在启动过程期间,尽管内存管理尚未初始化,但内核仍然需要分配内存以创建各种数据结构。bootmem分配器用于在启动阶段早期分配内存。显然,对该分配器的需求集中于简单性方面,而不是性能和通用性。因此内核开发者决定实现一个最先适配(first-fit)分配器用于在启动阶段管理内存。这是可能想到的最简单的方式。该分配器使用一个位图来管理页,位图比特位的数目与系统中物理内存页的数目相同。比特位位1,原创 2012-08-16 10:12:06 · 3704 阅读 · 0 评论 -
Linux内存管理 Slab分配器(二:初始化)
初看起来,slab系统的初始化不是特别麻烦,因为伙伴系统已经完全启用,内核没有受到其他特别的限制。尽管如此,由于slab分配器的结构所致,这里有一个鸡与蛋的问题。为初始化slab数据结构,内核需要若干远小于一整页的内存块,这些最适合由kmalloc分配。这里是关键所在:只有在slab系统已经启用之后,才能使用kmalloc。更确切的说,该问题涉及kmalloc的Per-CPU缓存的初始化。在这些缓原创 2012-09-15 16:37:38 · 2902 阅读 · 0 评论 -
Linux内存管理 Slab分配器(一:概述)
采用伙伴算法分配内存时,每次至少分配一个页面。但当请求分配的内存大小为几十个字节或几百个字节时应该如何处理?如何在一个页面中分配小的内存区,小内存区的分配所产生的内碎片又如何解决?Linux采用Slab。Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff 的分配器是围绕对象缓存进行的。在内核中,会为有限的对象集(例如文原创 2012-09-15 13:22:37 · 14301 阅读 · 1 评论 -
不连续内存区得分配和释放
分配内存区:vmalloc是一个接口函数,内核代码使用它来分配在虚拟内存中连续但在物理内存中不一定连续的内存。因为用于vmalloc的内存页总是必须映射在内核地址空间中,因此使用ZONE_HIGHMEM内存域的页要优于其他内存域。这使得内核可以节省比较宝贵的低端内存域,而又不会带来而外的坏处。因此,vmalloc是内核出于自身的目的使用高端内存页得少数情况之一。内核在管理虚拟内存中的v原创 2012-09-09 15:50:47 · 3307 阅读 · 0 评论 -
linux内存伙伴算法(二:初始化内存域和数据结构)
体系结构相关代码需要在启动期间建立以下信息:1.系统中各个内存域的页帧边界,保存在max_zone_pfn中2.个结点页帧的分配情况,保存在全局变量early_node_map中。从内核版本2.6.10开始提供一个通用的框架,用于将上述信息转换为伙伴系统预期的结点和内存域数据结构。在这以前,各个体系结构必须自行建立相关结构。现在,体系结构相关代码只需要建立前述的简单结构,将繁重的工作留原创 2012-09-03 13:42:40 · 3872 阅读 · 0 评论 -
boot memory allocator——自举内存分配器(五:停用bootmem)
在系统初始化进行到伙伴系统分配器能够承担内存管理的责任后,必须停用bootmem分配器,毕竟不能同时用两个分配器管理内存。在UMA和NUMA系统上,停用分别由free_all_bootmem和free_all_bootmem_node完成。在伙伴系统建立以后,特定于体系结构的初始化代码需要调用这两个函数。本文还是选择讨论UMA系统。free_all_bootmem如下:unsigned原创 2012-08-17 15:10:40 · 2224 阅读 · 2 评论 -
boot memory allocator——自举内存分配器(四:内存释放)
在bootmem阶段,内核提供了free_bootmem函数来释放内存。它需要两个参数:需要释放的内存区的起始地址和长度。不出意外,NUMA系统上等价函数的名称为free_bootmem_node,它需要一个额外的参数来指定结点。void __init free_bootmem(unsigned long addr, unsigned long size){ free_bootmem_co原创 2012-08-16 22:55:09 · 2431 阅读 · 0 评论 -
boot memory allocator——自举内存分配器(三:内存分配)
内核提供了各种函数,用于在初始化期间分配内存。在UMA系统上有下列函数可用。alloc_bootmem(size)和alloc_boormem_pages(sizes)按指定大小在ZONE_NORMAL内存域分配内存。数据是对齐的,这使得内存或者从可适用于L1高速缓存的理想位置开始,或者从也边界开始。尽管alloc_boormem_pages(sizes)的名字暗示所需内存长度是以页为单位,但原创 2012-08-16 21:37:03 · 1819 阅读 · 0 评论 -
linux内存伙伴算法(三:分配页)
伙伴系统中用于分配页的函数如下:alloc_pages(mask,order)分配2^order页并返回一个struct page的实例,表示分配的内存块的起始页。alloc_page(mask)是前者在order=0情况下的简化形式,只分配一页。get_zeroed_page(mask)分配一页并返回一个page实例,页对应的内存填充0(所有其他函数分配之后的内容是未定义的)。__g原创 2012-09-04 11:20:53 · 3690 阅读 · 0 评论