• kmalloc、vmalloc、__get_free_pages()的区别


    一、分布位置上的区别:

    kmalloc()__get_free_pages()函数申请的内存位于物理内存的映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在简单的线性关系;(3G+896M)(低端内存);

    vmalloc函数申请的虚拟内存与物理内存之间也没有简单的换算关系;(高端内存)(3G+896M以上的内存);

     

    二、特性上的区别:

    1、kmalloc()

    void *kmalloc(size_t size, int flags);

    kmalloc第一个参数是要分配块的大小,第二个参数为分配标志,用于控制kmalloc的行为;

    最常用的分配标志是GFP_KERNEL,其含义是内核空间的进程中申请内存。kmalloc()的底层依赖__get_free_page()实现,分配标志的前缀GFP正好是底层函数的缩写。

    kmalloc申请的是较小的连续的物理内存,内存物理地址上连续,虚拟地址上也是连续的,使用的是内存分配器slab的一小片。申请的内存位于物理内存的映射区域。其真正的物理地址只相差一个固定的偏移。可以用两个宏来简单转换__pa(address) { virt_to_phys()} __va(address) {phys_to_virt()}

    使用kmalloc函数之后使用kfree函数;

     

    2、__get_free_pages()

    get_free_page()申请的内存是一整页,一页的大小一般是128K。

     从本质上讲,kmalloc和get_free_page最终调用实现是相同的,只不过在调用最终函数时所传的flag不同而已。

    3、vmalloc()

    vmalloc()一般用在只存在于软件中的较大顺序缓冲区分配内存,vmalloc()远大于__get_free_pages()的开销,为了完成vmalloc(),新的页表需要被建立。所以效率没有kmalloc和__get_free_page效率高;

    三、另外的一些东西:

    kmalloc()

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

    kzalloc函数

    用kzalloc申请内存的时候, 效果等同于先是用 kmalloc() 申请空间 , 然后用 memset() 来初始化 ,所有申请的元素都被初始化为 0.
     对应的释放函数也是kfree函数;

  • 相关阅读:
    python学习笔记 day14 各种推导式
    python学习笔记 day14 生成器表达式
    python学习笔记 day14 生成器进阶(二)
    python学习笔记 day14 生成器进阶
    python学习笔记 day13 迭代器
    python 学习笔记 day12 作业讲解--员工信息表
    PAT L3-020 至多删三个字符
    2019省赛训练组队赛3.26周二---FJUT 2016
    PAT L3-007 天梯地图
    POJ 2234 Matches Game
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/7477370.html
Copyright © 2020-2023  润新知