Linux中的内存分配和释放之free_area_init_node()函数分析

本文详细解析Linux内核中的free_area_init_node()函数,介绍了其在内存分配和释放过程中的作用,包括初始化节点的内存区域、计算内存页数和孔洞页数,以及设置内存页区的struct page结构体等关键步骤。
摘要由CSDN通过智能技术生成

  在对free_area_init_node()函数分析之前,我们也要看看它的源头,这个函数的调用过程如下start_kernel()->paging_init()->free_area_init_node(),我们来看看在调用这个函数之前,在paging_init()前面的语句做了些什么。

  /*
  * initialise the zones within each node
  */

  for (node = 0; node < numnodes; node++) {
  unsigned long zone_size[MAX_NR_ZONES];//存放这个内存node的全部内存页数。
  unsigned long zhole_size[MAX_NR_ZONES];//存放这次内存node的孔洞内存页数。(每个成员对应该内存node的一个页区)
  struct bootmem_data *bdata;
  pg_data_t *pgdat;
  int i;

  /*
   * Initialise the zone size information.
   */
  for (i = 0; i < MAX_NR_ZONES; i++) {
              zone_size[i]  = 0;
              zhole_size[i] = 0;
  }//对这次内存node的最多3个内存页区内存页数和孔洞内存页数清零。

  pgdat = NODE_DATA(node);//获得这个node对应的disconting_node_data[n]
  bdata = pgdat->bdata;

  /*
   * The size of this node has already been determined.
   * If we need to do anything fancy with the allocation
   * of this memory to the zones, now is the time to do
   * it.
   */
  zone_size[0] = bdata->node_low_pfn -
    (bdata->node_boot_start >> PAGE_SHIFT);//获得本次内存node的全部页数

  /*
   * If this zone has zero size, skip it.
   */
  if (!zone_size[0])
   continue;

  /*
   * For each bank in this node, calculate the size of the
   * holes.  holes = node_size - sum(bank_sizes_in_node)
   */
  zhole_size[0] = zone_size[0];
  for (i = 0; i < mi->nr_banks; i++) {
   if (mi->bank[i].node != node)
    continue;

   zhole_size[0] -= mi->bank[i].size >> PAGE_SHIFT;
  }//上面这个循环可以很容易弄明白zhole_size[0]存放着本次内存node的内存孔洞的页数。

  /*
   * Adjust the sizes according to any special
   * requirements for this machine type.
   */
  arch_adjust_zones(node, zone_size, zhole_size);//这是一个空函数。

  free_area_init_node(node, pgdat, zone_size,
    bdata->node_boot_start >> PAGE_SHIFT, zhole_size);
 }

  void __init free_area_init_node(int nid, struct pglist_data *pgdat,
  unsigned long *zones_s

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值