kmalloc vmalloc malloc mmap

2024-02-18 13:58
文章标签 mmap malloc vmalloc kmalloc

本文主要是介绍kmalloc vmalloc malloc mmap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考:http://blog.csdn.net/tigerjb/article/details/6412881

http://linux.chinaunix.net/techdoc/system/2008/06/16/1011365.shtml

http://www.xiangmocheng.com/2009/09/kmalloc-vmalloc-malloc-difference/

http://blog.csdn.net/gxfan/article/details/2723455

http://www.360doc.com/content/11/1201/10/1317564_168823458.shtml

           Linux源码情景分析——毛德操


参考网站上给出了kmalloc和vmalloc的用法和区别,本文从kmalloc和vmalloc实现的角度来分析二者的不同:

首先来看kmalloc和vmalloc的实现(linux2.4内核)

void * kmalloc (size_t size, int flags)
{cache_sizes_t *csizep = cache_sizes;for (; csizep->cs_size; csizep++) {if (size > csizep->cs_size)continue;return __kmem_cache_alloc(flags & GFP_DMA ?csizep->cs_dmacachep : csizep->cs_cachep, flags);}BUG(); // too big sizereturn NULL;
}


void * __vmalloc (unsigned long size, int gfp_mask, pgprot_t prot)
{void * addr;struct vm_struct *area;size = PAGE_ALIGN(size);if (!size || (size >> PAGE_SHIFT) > num_physpages) {BUG();return NULL;}area = get_vm_area(size, VM_ALLOC);if (!area)return NULL;addr = area->addr;if (vmalloc_area_pages(VMALLOC_VMADDR(addr), size, gfp_mask, prot)) {vfree(addr);return NULL;}return addr;
}


我们清楚地看到,kmalloc从通用缓冲区中申请空间,而vmalloc则无此要求,它利用普通的申请页面的函数进行申请,

重点在其对页面的虚拟地址是有要求的:VMALLOC_START~4GB

malloc最终调用do_brk(),在用户空间的堆栈中申请空间,不过do_brk做“批发”,malloc做“零售”

mmap()将一个已经打开的文件的内容映射到他的用户空间,使得能够像访问内存一样访问文件。

    当需要分配一个不具有专用slab队列的数据结构而不必为之使用整个页面时,就应该通过kmalloc分配

,这些一般都是些细小而又不常用的数据结构,如果数据结构大小接近一个页面,则应该直接通过

alloc_pages为之分配一个页面;函数vmalloc从内核的虚存空间(3G)分配一块虚存以及相应的物理内存,

类似与系统调用brk()。不过brk()是由进程在用户控件启动并从用户控件分配的,而vmalloc则是在系统空间

,也就是内核启动,从内核空间分配的。由vmalloc分配的空间不会被kswapd换出,因为kswapd只扫描各个

进程的用户空间,而根本看不到通过vmalloc分配到 页面表项。至于通过kmalloc分配的数据结构,则kswapd

只是从各个slab队列中寻找和收集空闲不用的slab,并释放占用的页面,但是不会将尚在使用的slab所占据

的页面换出。


这篇关于kmalloc vmalloc malloc mmap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/721374

相关文章

C语言动态内存空间分配(malloc,calloc,realloc,free)

为了代码观感美观,我将代码部分的注释删了 malloc #include<stdio.h>#include<stdlib.h>#include<errno.h>//使用动态内存分配函数的注意事项://1.要判断指针是否为空指针,如果没有成功开辟动态内存空间,则不能继续使用该指针//2.分配的动态内存空间的数量要大于等于赋值的元素的数量,不能造成动态内存的越界访问//3.动态内存空间中

Linux malloc内存分配实现原理

目录   一、用户进程虚拟内存空间布局 二、malloc工作原理 2.1 malloc实现流程 2.1.1 brk方式申请内存 2.1.2 mmap方式分配内存 2.2 核心代码 2.3 malloc分配物理内存的时机 2.4 malloc分配的实际内存大小 三、虚拟内存与物理内存 3.1 如何建立映射 3.2 分配物理内存 3.3 物理内存访问 四、new和mall

malloc和new的区别是什么?

目录 前言 ​编辑 1. 语言级别 2. 内存分配和初始化 3. 返回类型 4.失败时的行为 5. 释放内存 6. 运用场景 前言 malloc 是 C 语言的内存分配函数,简单但不支持对象初始化。new 是 C++ 中的运算符,功能更强大,能够同时进行内存分配和对象初始化,并且支持异常处理。 1. 语言级别 malloc:是 C 语言中的标准库函数,用于分配

malloc/free 和 new/delete的区别

malloc/free 和 new/delete 是 C++ 中两种不同的动态内存管理方法,它们有一些关键的区别: 1. 内存分配和释放机制 malloc 和 free: 函数: malloc 是一个 C 标准库函数,用于从堆中分配指定大小的原始内存块。它返回一个 void* 指针,指向分配的内存块的起始位置。free 用于释放由 malloc 分配的内存,防止内存泄漏。初始化: mallo

mmap实现原理

转载处    http://blog.csdn.net/joejames/article/details/37958017 觉得写得非常不错,转载一下以作学习 一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了。。。下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内存映射就很明朗了。

从0实现malloc函数

本文介绍如何用c语言实现一个简单的内存分配器,可替换glibc中的 malloc(), calloc(), realloc(), free(). 这是一篇入门级别的文章,所以不会介绍所有的细节。 代码实现主要为了演示内存分配器的基本工作原理,所以和工业级内存分配器相比,缺少非常多的性能优化,分配内存时也不会按页对齐,但是至少,我们构建的内存分配器是可以工作的。 在构建内存分配器之前,需要先介绍

malloc realloc calloc的区别

void *malloc(size_t,size)   malloc函数用来从堆空间中申请指定的size个字节的内存大小;     void *realloc(void *mem_address, size_t new_size)   用来重新指定mem_address所指向的空间的大小,其大小为new_size,如果mem_address

结构体中的malloc 与 free

结构体中动态内存的管理(malloc和free) C语言中内存的管理主要是依据malloc和free实现的,其中malloc主要是实现内存的分配,而free则是实现内存的释放。虽然这是我们已经很熟悉的,但是还是存在一些问题。特别是当结构体中存在指针的情况下,各种问题也就会展现出来。 其中最大的问题是:结构体中指针变量没有指向一块合法的内存空间,就对指针参数进行操作,这也是很多C语言

malloc()函数和free()函数源代码

虽然malloc()函数和free()函数是C语言中最常用的函数之一,但是可能大多数人只是用它,却没有去查看它的原型。记得有一次听一个学长说他去面试,面试官让他写出malloc()函数的原型,他当时不知所措就悲剧了。今天看了一篇文章,给出了malloc()函数的源代码,特转载于此与大家共享。 原文地址:http://blog.sina.com.cn/s/blog_642bb61

MIT6.S081最详解析与归纳——lab10:mmap

Lab10主题:mmap (一)前置知识:mmap(1)VMA(2)mmap (二)Lab:mmap(1)前置工作(2)实现sys_mmap()(3)实现pagefault(4)实现sys_munmap(5)脏页位设置(六)其它函数的小修改 (三)感言 (一)前置知识:mmap (1)VMA VMA(Virtual Memory Area) 代表虚拟内存区域,它描述了一个进程