关于kmalloc vmalloc 和malloc

用户态的malloc是申请堆空间的用户态函数。可网上不少人以为malloc在内核态的调用函数是kmalloc或vmalloc,这是不对的 kmalloc是基于slab的,它在通用缓存区申请分配,通用缓存区一共26块缓存块,使用DMA和常规分配各占有13个。

当调用vmalloc时,先调用kmalloc(之所以没有直接使用专用缓存,是因为vmalloc调用本来就不是很频繁,而且开销有些大,需要建立页表到页框的映射,还要刷新tlb,)分配一块可以存放所申请物理页框数量的描述符的空间,最后直接调用alloc_page每次申请一个物理页框。

言归正传:

malloc首先获得的是线性区间,并没有获得物理内存,因为内核就是这么强硬,爱咋咋滴^^。当用户像这个线性区间写入时必定产生缺页,进入缺页处理程序,经判断,这是一个匿名映射,然后在高端内存直接调用__alloc_pages(本来高端内存就是给用户使用的)。

时间: 2024-12-15 01:38:47

关于kmalloc vmalloc 和malloc的相关文章

kmalloc、vmalloc、malloc的区别

简单的说: kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存 kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc不保证任何东西(这点是自己猜测的,不一定正确) kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大 内存只有在要被DMA访问的时候才需要物理上连续 vmalloc比kmalloc要慢 详细的解释: 对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换

Memory Allocation API In Linux Kernel && Linux Userspace、kmalloc vmalloc Difference、Kernel Large Section Memory Allocation

目录 1. 内核态(ring0)内存申请和用户态(ring3)内存申请 2. 内核态(ring0)内存申请:kmalloc/kfree.vmalloc/vfree 3. 用户态(ring3)内存申请:malloc/free 4. 内核内存申请原则 5. 内核中分配物理地址连续的大段内存 1. 内核态(ring0)内存申请和用户态(ring3)内存申请  0x1: 差异点 在内核中申请内存和在用户空间中申请内存不同,有以下因素引起了复杂性,包括 1. 内核的虚拟和物理地址被限制到1GB 2. 内核

LINUX内核内存管理kmalloc,vmalloc

一.kmalloc与vmallco 在设备驱动程序或者内核模块中动态开辟内存,不是用malloc,而是kmalloc ,vmalloc,释放内存用的是kfree,vfree,kmalloc函数返回的是虚拟地址(线性地址). kmalloc特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要. 而用vmalloc分配的内存只是线性地址连续,物理地址不一定连续,不能直接用于DMA.vmalloc函数的工作方式类似于kmalloc,只不过前者分配的内存虚拟地址是连续的,而物理地址则

Samsung_tiny4412(笔记)-->alloc_pages,kmalloc,vmalloc,kmem_cache,class

/*********************************************************************************** * * Samsung_tiny4412(笔记)-->alloc_pages,kmalloc,vmalloc,kmem_cache,class * * 声明: * 1. 本文中有些源代码没有全部帖出来,主要是因为篇幅太大的原因; * 2. 基于1中的原因,本文借鉴了python中的缩进代码风格进行代码的体现: * 1. 有些代码

linux内存管理之malloc、vmalloc、kmalloc的区别

1.kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存 2.kmalloc保证分配的内存在物理上是连续的,内存只有在要被DMA访问的时候才需要物理上连续,malloc和vmalloc保证的是在虚拟地址空间上的连续 3.kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大 4.vmalloc比kmalloc要慢.尽管在某些情况下才需要物理上连续的内存块,但是很多内核代码都用kmalloc来获得内存,而不是vmalloc.这主要是出于性能的

malloc,vmalloc与kmalloc,kfree与vfree的区别和联系

kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大内存只有在要被DMA访问的时候才需要物理上连续vmalloc比kmalloc要慢1)kmalloc分配的物理地址与虚拟地址只有一个PAGE—OFFSET偏移,不需要为地址段修改页表.Vmalloc类函数地址完全虚拟,每次分配都需要对页表进行设置,当

Kmalloc和Vmalloc的区别

kmalloc()和vmalloc()介绍kmalloc()用于申请较小的.连续的物理内存1. 以字节为单位进行分配,在<linux/slab.h>中2. void *kmalloc(size_t size, int flags) 分配的内存物理地址上连续,虚拟地址上自然连续3. gfp_mask标志:什么时候使用哪种标志?如下:--------------------------------情形 相应标志--------------------------------进程上下文,可以睡眠 G

nf_conntrack: falling back to vmalloc.

System log message file is reporting "kernel: nf_conntrack: falling back to vmalloc". Memory page availability can be further checked from /proc/buddyinfo as below. # cat /proc/buddyinfo Node 0, zone DMA 1 0 1 0 1 1 1 0 1 1 3 Node 0, zone DMA32

linux内存管理初学

虚拟内存模型 Linux 内核本身并不运行在虚拟空间中,其使用的是物理寻址模式. 物理内存被分割为界面,一个内存页面的大小由PAGE_SIZE宏决定. 虚拟地址空间的方式使程序员可以将巨大的结构用于连续的地址,而不必考虑物理内存上的限制. 线性地址到物理地址 线性地址需要由处理器或者一个单独的MMU转换为物理地址,转换方式如下: 解析的方式为: 1.用线性地址中的第一个位段为下标可以在页面目录中找的一个表项,这个表项指向某个中间目录. 2.用线性地址中的第二个位段为下标可以在该中间目录中找到一个