• Kmalloc和Vmalloc的区别


    Kmalloc和Vmalloc的区别

     

    kmalloc()和vmalloc()介绍
    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
    ———————————————————————————————-
    4. void kfree(const void *ptr)
    释放由kmalloc()分配出来的内存块


    vmalloc()
    用于申请较大的内存空间,虚拟内存是连续的
    1. 以字节为单位进行分配,在<linux/vmalloc.h>中
    2. void *vmalloc(unsigned long size) 分配的内存虚拟地址上连续,物理地址不连续
    3. 一般情况下,只有硬件设备才需要物理地址连续的内存,因为硬件设备往往存在于MMU之外,根本不了解虚拟地址;但为了性能上的考虑,内核中一般使用 kmalloc(),而只有在需要获得大块内存时才使用vmalloc(),例如当模块被动态加载到内核当中时,就把模块装载到由vmalloc()分配 的内存上。
    4.void vfree(void *addr),这个函数可以睡眠,因此不能从中断上下文调用。


    malloc(), vmalloc()和kmalloc()区别
    [*]kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存
    [*]kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc不保证任何东西(这点是自己猜测的,不一定正确)
    [*]kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
    [*]内存只有在要被DMA访问的时候才需要物理上连续
    [*]vmalloc比kmalloc要慢

    kmalloc()与vmalloc()的区别

       kmalloc()与vmalloc() 都是在内核代码中提供给其他子系统用来分配内存的函数,但二者有何区别?

       从前面的介绍已经看出,这两个函数所分配的内存都处于内核空间,即从3GB~4GB;但位置不同,kmalloc()分配的内存处于3GB~high_memory之间,而vmalloc()分配的内存在VMALLOC_START~4GB之间,也就是非连续内存区。一般情况下在驱动程序中都是调用kmalloc()来给数据结构分配内存,而vmalloc()用在为活动的交换区分配数据结构,为某些I/O驱动程序分配缓冲区,或为模块分配空间,例如在include/asm-i386/module.h中定义了如下语句:

      #define module_map(x)           vmalloc(x)

      其含义就是把模块映射到非连续的内存区。

     与kmalloc()和vmalloc()相对应,两个释放内存的函数为kfree()和vfree()。

    kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存
    kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续
    kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
    内存只有在要被DMA访问的时候才需要物理上连续
    vmalloc比kmalloc要慢

    1)kmalloc分配的物理地址与虚拟地址只有一个PAGE—OFFSET偏移,不需要为地址段修改页表。

    Vmalloc类函数地址完全虚拟,每次分配都需要对页表进行设置,当然效率低。
    2)vmalloc使用的正确场合是分配一大块,连续的,只在软件中存在的,用于缓冲的内存区域。不能在微处理器之外使用。
    3)vmalloc 中调用了 kmalloc (GFP—KERNEL),因此也不能应用于原子上下文。

    kmalloc和 kfree管理内核段内分配的内存,这是真实地址已知的实际物理内存块。vmalloc和vfree是对内核使用的虚拟内存进行分配和释放。 kmalloc返回的内存是物理的,连续的,更适合于类似设备驱动的程序来使用。但vmalloc能使用更多的资源,因为vmalloc还可以处理交换空 间。

    kmalloc()分配的内存在0xBFFFFFFF-0xFFFFFFFF以上的内存中,driver一般是用它来完成对DS的分配
    vmalloc()则是位于物理地址非连续,虚地址连续区,起始位置由VMALLOL_START来决定,一般作为交换区、模块的分配

    kmalloc对应于kfree,可以分配连续的物理内存;
    vmalloc对应于vfree,分配连续的虚拟内存,但是物理上不一定连续。


    vmalloc分配内存的时候逻辑地址是连续的,但物理地址一般是不连续的,适用于那种一下需要分配大量内存的情况,如insert模块的时候。这种分配方式性能不入kmalloc。

    kmalloc分配内存是基于slab,因此slab的一些特性包括着色,对齐等都具备,性能较好。物理地址和逻辑地址都是连续的


    最主要的区别是

    分配大小的问题。
    比如你需要28个字节,那一定用KMALLOC,如果用VMALLOC,分配不多次机器就罢工了

     
  • 相关阅读:
    设计模式总结
    centos7.5 安装python3.7
    搭建yum软件源
    centos安装gitbook
    编译技术
    samba安装
    docker命令
    shell基础知识
    随笔
    虚拟机字节码执行引擎(三)
  • 原文地址:https://www.cnblogs.com/axjlxy/p/15597328.html
Copyright © 2020-2023  润新知