zoukankan      html  css  js  c++  java
  • Linux设备驱动程序 之 get_free_page

    get_free_page

    如果模块需要分配大块的内存,使用面向页的分配会有很多优点;

    分配页面可使用下面的函数:

    1 unsigned long get_zeroed_page(gfp_t gfp_mask)

    返回指向新页面的指针并将页面清零;

    1 unsigned long __get_free_page(gfp_t gfp)

    返回指向新页面的指针,不清零页面;

    1 unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)

    分配若干(物理连续的)页面,并返回指向该内存区域第一个字节的指针,不清零页面;其中order是要分配的页面数以2为底的对数,例如,0表示一个页面,3表示8个页面;get_order函数使用一个整数参数,可根据宿主平台的大小返回order值,可允许的最大的order值是10或者11(对应于1024或者2048个页),这依赖于体系结构;

    当程序不需要使用页面时,可以使用下面的函数之一来释放它们;

    1 void free_page(unsigned long addr)
    2 
    3 void free_pages(unsigned long addr, unsigned int order)

    如果试图释放和先前分配数目不等的页面,内存映射关系就会被破坏,随后系统就会出错;

    只要符合和kmalloc同样的规则,get_free_pages和其他函数都可以在任何时间调用;某些情况下函数会分配内存失败,特别是子啊使用了GFP_ATOMIC的时候,因此必须在分配出错时提供相应的处理;

    尽管kmalloc(GFP_KERNEL)在没有空闲内存时有时会失败,但内核会尽可能满足这个内存分配请求;因此,分配太多的内存,系统响应性能就很容易下来;系统为满足kmalloc分配请求而试图换出尽可能多的内存页时,就会变慢;甚至无法为解决这个问题而生成新的进程;

    基于页的分配策略的优点实际不在速度上,而在于更有效的使用内存;按页分配不会浪费内存空间,而kmalloc函数则会因分配力度的原因而浪费一定数量的内存;并且当分配的页面完全属于我们自己时,可以通过适当的调整页表把它们合并成一个线性区域,例如允许用户进程对这些单一互不相关的内存区域进行mmap;

    alloc_pages

    struct page是内核用来描述单个内存页的数据结构;内核在很多地方使用page结构,尤其是在需要高端内存(高端内存在内核空间没有对应不变的地址)的地方;

    Linux页分配器的核心代码称为alloc_pages_node函数;

    1 struct page *alloc_pages_node(int nid, gfp_t gfp_mask,
    2                         unsigned int order)

    这个函数具有两个变种,大多数情况下我们使用这两个宏;

    1 #define alloc_pages(gfp_mask, order)
    2 #define alloc_page(gfp_mask)

    alloc_pages_node要求传入三个参数,nid是NUMA节点的ID号,表示要在其中分配内存,mask是通常的GFP_分配标志,order是要分配的内存大小;该函数的返回值指向一个page结构(可能返回多个页)的指针,它描述了已分配的内存;或者而在失败时返回NULL;

    alloc_pages通过在当前的NUMA节点上分配内存而简化了alloc_pages_node函数,它将numa_node_id的返回值nid参数而调用了alloc_pages_node函数,另外,alloc_page函数显然忽略了order参数而只分配单个页面;

    为了释放通过上述途径分配的页面,我们应该使用下面的函数:

    1 #define __free_page(page) __free_pages((page), 0)
    2 void __free_pages(struct page *page, unsigned int order)
    3 void free_hot_cold_page(struct page *page, bool cold)

    在知道某个页面的内容是否在处理器告诉缓存中时,则应该使用free_hot_cold_page来和内核通信,这个信息可以帮助内存分配器优化内存使用;

  • 相关阅读:
    SAP CDS view单元测试框架中的访问者(Visitor)设计模式使用介绍
    如何用SAP CRM中间件从ERP下载material division到CRM
    SAP CRM中间件Material Sales Organization和distribution channel的映射逻辑
    SAP CRM 中间件Request download里,遇到/SAPPSPRO/S_MAT_ENHANC_COMM 错误的解决办法
    SAP 数据库表CRMD_ORDERADM_I字段OBJECT_TYPE的计算逻辑
    一文带你了解数据中心大二层网络演进之路
    分布式身份:重新定义你的“身份”管理
    18篇文章系统解读:中台规划如何撬动企业IT基础设施转型升级
    案例展示自定义C函数的实现过程
    云原生2.0时代,华为云DevOps立体运维实践
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/11761063.html
Copyright © 2011-2022 走看看