zoukankan      html  css  js  c++  java
  • 内核申请内存

    kmalloc

    void *kmalloc(size_t size, gfp_t flags)

    物理地址是连续的。用于小块内存的申请

    __get_free_pages

    unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)
    {
        struct page *page;
    
        /*
         * __get_free_pages() returns a 32-bit address, which cannot represent
         * a highmem page
         */
        VM_BUG_ON((gfp_mask & __GFP_HIGHMEM) != 0);
    
        page = alloc_pages(gfp_mask, order);
        if (!page)
            return 0;
        return (unsigned long) page_address(page);
    }

    申请内存页,连续的物理地址。用于分配大块内存

    vmalloc

    void *vmalloc(unsigned long size)

    虚拟内存地址连续,物理地址上不连续。不能直接用于DMA传输,DMA要求物理地址空间是连续的

    gfp_t

    GFP_ATOMIC:用于在中断上下文和进程上下文之外的其它代码中分配内存,从不睡眠
    GFP_KERNEL:内核正常分配内存,可能睡眠
    GFP_USER:用于为用户空间页分配内存,可能睡眠
    GFP_HIGHUSER:如同GFP_USER,但它是从高端内存中申请

    注:如果要得到物理地址,需要使用virt_to_phys转换

  • 相关阅读:
    ElementUi
    Vue插件
    Vue-cli
    Vue进阶
    Vue组件
    Vue生命期钩子
    Vue基础
    Vue介绍
    logging模块
    time模块
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709652.html
Copyright © 2011-2022 走看看