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


    kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存
    kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续
    kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
    内存只有在要被DMA访问的时候才需要物理上连续(必须用kmalloc)
    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,分配不多次机器就罢工了。

    这些分配的都是虚拟(逻辑)内存,虚拟与物理内存的转换:

    虚拟 转 物理地址  virt_to_phys( *addr );
    物理 转 虚拟地址  phys_to_virt( *addr );

    区中 kmalloc和vmalloc

    一.kmalloc与vmallcoc

        在设备驱动程序或者内核模块中动态开辟内存,不是用malloc,而是kmalloc ,vmalloc,释放内存用的是kfree,vfree,kmalloc函数返回的是虚拟地址(线性地址). kmalloc特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要. 而用vmalloc分配的内存只是线性地址连续,物理地址不一定连续,不能直接用于DMA。vmalloc函数的工作方式类似于kmalloc,只不过前者分配的内存虚拟地址是连续的,而物理地址则无需连 续。通过vmalloc获得的页必须一个一个地进行映射,效率不高, 因此,只在不得已(一般是为了获得大块内存)时使用。vmalloc函数返回一个指针,指向逻辑上连续的一块内存区,其大小至少为size。在发生错误 时,函数返回NULL。vmalloc可能睡眠,因此,不能从中断上下文中进行调用,也不能从其它不允许阻塞的情况下调用。要释放通过vmalloc所获 得的内存,应使用vfree函数

        vmalloc和kmalloc的分配内存的特点大概如下:

            

      区别大概可总结为:

          1,vmalloc分配的一般为高端内存,只有当内存不够的时候才分配低端内存;kmallco从低端内存分配。

          2,vmalloc分配的物理地址一般不连续,而kmalloc分配的地址连续,两者分配的虚拟地址都是连续的;

          3,vmalloc分配的一般为大块内存,而kmaooc一般分配的为小块内存,(一般不超过128k);

       

  • 相关阅读:
    NHibernate之旅(14):探索NHibernate中使用视图
    NHibernate之旅(18):初探代码生成工具使用
    NHibernate之旅(15):探索NHibernate中使用存储过程(上)
    接下来5年中有用的10项开发技能
    NHibernate之旅(22):探索NHibernate一级缓存
    NHibernate之旅(24):探索NHibernate二级缓存(下)
    NHibernate之旅(17):探索NHibernate中使用存储过程(下)
    NHibernate之旅(11):探索多对多关系及其关联查询
    Python入门示例系列18 条件控制
    .NET计划之配置ASP.NET运行环境
  • 原文地址:https://www.cnblogs.com/Ph-one/p/4411423.html
Copyright © 2020-2023  润新知