• linux中常见内存分配函数(kmalloc,vmalloc等)


     

    分配原理

    可以分配的最大内存

    其他

    __get_free_pages

    直接对页框进行操作

    4MB

    适用于分配较大量的连续物理内存

    kmem_cache_alloc

    基于slab机制实现

    128KB

    适合需要频繁申请释放相同大小内存块时使用

    kmalloc

    基于kmem_cache_alloc实现

    128KB

    最常见的分配方式,需要小于页框大小的内存时可以使用

    vmalloc

    建立非连续物理内存到虚拟地址的映射

    物理不连续,适合需要大内存,但是对地址连续性没有要求的场合

    dma_alloc_coherent

    基于__alloc_pages实现

    4MB

    适用于DMA操作

    ioremap

    实现已知物理地址到虚拟地址的映射

    适用于物理地址已知的场合,如设备驱动

    alloc_bootmem

    在启动kernel时,预留一段内存,内核看不见

    小于物理内存大小,内存管理要求较高

    kmalloc() 申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因为存在较简单的转换关系,所以对申请的内存大小有限制,不能超过128KB。
    较常用的 flags(分配内存的方法):

    GFP_ATOMIC —— 分配内存的过程是一个原子过程,分配内存的过程不会被(高优先级进程或中断)打断;
    GFP_KERNEL —— 正常分配内存;
    GFP_DMA —— 给 DMA 控制器分配内存,需要使用该标志(DMA要求分配虚拟地址和物理地址连续)。
    flags 的参考用法:
     |– 进程上下文,可以睡眠     GFP_KERNEL
     |– 进程上下文,不可以睡眠    GFP_ATOMIC
     |  |– 中断处理程序       GFP_ATOMIC
     |  |– 软中断          GFP_ATOMIC
     |  |– Tasklet         GFP_ATOMIC
     |– 用于DMA的内存,可以睡眠   GFP_DMA | GFP_KERNEL
     |– 用于DMA的内存,不可以睡眠  GFP_DMA |GFP_ATOM

    对应的是内存释放函数:

    void kfree(const void *objp);

    转载自:https://blog.csdn.net/wzhwho/article/details/4996510

  • 相关阅读:
    优秀数
    加法检测器
    数字转换
    选课
    二叉苹果树
    分离与合体
    括号配对
    凸多边形的划分
    能量项链
    石子合并
  • 原文地址:https://www.cnblogs.com/zongfanstudy/p/14763760.html
Copyright © 2020-2023  润新知