• kmalloc、kzalloc、vmalloc、kmem_cache_alloc的区别


    kmalloc()
    #include
    void *kmalloc(size_t size , int flags);                    //使用kfree();释放内存
    1
    2
    其中flags参数有必要讲一下:一般代码中会用GFP_KERNEL和GFP_ATOMIC两种。
    GFP_KERNEL 常规的分配标志,可能会阻塞,但并不是始终使用。
    GFP_ATOMIC 这个标志用在中断处理程序、下半部、持有自旋锁以及其他不能睡眠的地方。
    注意:kmalloc能够分配的内存块大小,存在一个上限。
    kzalloc()
    用kzalloc申请内存的时候,效果等同于先是用kmalloc()申请空间,然后用memset()来初始化,所有申请的元素都被初始化为0.


    static inline void *kzalloc(size_t size, gfp_t flags)
    {
        return kmalloc(size, flags | __GFP_ZERO);

    1
    2
    3
    4
    5
    vmalloc()

    #include
    void *vmalloc(unsigned long size);     //使用vfree();释放内存
    1
    2
    两者区别
    1、 vmalloc()分配的内存虚拟地址是连续的,而物理地址无须连续。而kmalloc()确保页在物理地址上是连续的,自然虚拟地址也是连续的。硬件设备用的的任何内存区都必须是物理上连续的块,而不仅仅是虚拟地址连续上的块。
    2、 vmalloc()相比较于kmalloc()效率不高,因为获得的页必须转换为虚拟地址空间上连续的页,必须专门建立页表项。
    3、 vmalloc()仅在不得已时才使用——典型的就是为了申请大块内存。该函数可能睡眠,因此不能从终端上下文中调用,也不能从其他不允许阻塞的情况下进行调用。
    顺带提一句,kmalloc和vmalloc分配的是内核的内存,malloc分分配的是用户的内存。

    kmem_cache_alloc

    void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
    1
    kmalloc是基于kmem_cache_create实现的;
    如果是申请固定大小的内存空间,kmalloc和kmem_cache_alloc时间效率相当。kmem_cache_create申请的内存大小是固定的。
    因为kmalloc所利用的内存块的大小是事先定义好的,所以很多情况下会产生内部碎片,浪费空间,而kmem_cache_alloc由于内存大小也是量身定做的缘故则不会。但是,有一点是kmem_cache_alloc所不能做到的,那就是动态大小的内存空间,这个任务是非kmalloc莫属。

    Add
    phys_to_virt/virt_to_phys

    对于提供了MMU的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。进程的4GB内存空间被人为的分为两个部分:用户空间与内核空间。用户空间地址分布从0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB为内核空间。

    内核空间中,从3G到vmalloc_start这段地址是物理内存映射区域(该区域中包含了内核镜像、物理页框表mem_map等等),比如VMware虚拟系统内存是160M,那么3G~3G+160M这片内存就应该映射物理内存。在物理内存映射区之后,就是vmalloc区域。
    对于160M的系统而言,vmalloc_start位置应在3G+160M附近(在物理内存映射区与vmalloc_start期间还存在一个8M的gap来防止跃界),vmalloc_end的位置接近4G(最后位置系统会保留一片128k大小的区域用于专用页面映射),
      kmalloc和get_free_page申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系,virt_to_phys()可以实现内核虚拟地址转化为物理地址
    ————————————————
    版权声明:本文为CSDN博主「zuhan_20210314」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_35399548/article/details/114787730

  • 相关阅读:
    科技赋能无人零售
    机器学习:集成学习(Python)
    Java AtomicInteger 学习以及理解
    在宝塔中nginx安装不成功
    res_company_white_url.py 详解
    [附源码]计算机毕业设计停车场管理系统Springboot程序
    Vue3 computed根据返回的字段显示颜色
    Linux17 jdk tomcat idea mysql在linux上安装
    总结:Tomcat的IO模型
    SQL(Structured Query Language)—结构化查询语言
  • 原文地址:https://blog.csdn.net/u012294613/article/details/126302648