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转换

  • 相关阅读:
    Hadoop命令解释
    sql的嵌套
    设计模式1 订阅者模式
    我的桌面515
    夜黑我也黑
    测试测试
    竖表转横表(支持多列)
    昨天晚上做了一个梦
    viewpage插件修改版增加 复制媒体文件地址
    PhireeNote 只有自动保存功能的简易记事本
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709652.html
Copyright © 2011-2022 走看看