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

本文详细分析了Linux内核中的__free_pages()函数,讲解了其在内存释放过程中的作用,包括free_hot_page()和__free_pages_ok()函数。文章介绍了冷热区内存管理机制,阐述了释放内存页时如何处理冷区和热区,并通过伙伴系统进行内存合并和释放。通过对struct page、struct zone和struct per_cpu_pages等数据结构的讨论,揭示了Linux内核中内存分配和释放的细节。
摘要由CSDN通过智能技术生成

  记得我们在上篇文章mem_init()分析中提到__free_page()函数吗?我们现在来完善它。它的调用过程是这样的:mem_init()->free_all_bootmem_node():我们知道这个函数是统计一共释放了多少空闲页。->free_all_bootmem_core()就是在这个函数里面先后多次调用__free_pages()函数。目的就是为了释放每个内存node里面无用的内存孔洞页。我们现在就来好好探讨这个函数。

  fastcall void __free_pages(struct page *page, unsigned int order)
{
   if (!PageReserved(page) && put_page_testzero(page)) {
       if (order == 0)
          free_hot_page(page);//我们先来看看这个函数。
   else
      __free_pages_ok(page, order);//我们最后才来讨论这个函数。
   }
}

 

  void fastcall free_hot_page(struct page *page)
{
   free_hot_cold_page(page, 0);
}

 

  static void fastcall free_hot_cold_page(struct page *page, int cold)//如果cold是0的话,表示要把page所指向内存页释放到

                                                                  //其所在内存页区中当前处理器的“热区”内存中,如果为1的话,就释放到这页所在页区

                                                              //中当前处理器的“冷区”高速缓存内存中。在这里肯定有不少人不太了解linux在启动后是

                                                             //如何分配和释放内存的。我在这里讲个大概,在以后的文章中会结合代码细讲的。

  //一个核心概念要记住,多页时通过伙伴机制,单页时使用“热冷区”。我们这个函数先涉及后者机制。我们先来说说这个机制。

 /首先,大家都很了解struct zoon这个结构体,里面涉及了一个与“冷热区”相关的重要成员:struct per_cpu_pageset pageset

//[NR_CPUS]里面的成员我不打算全讲,NR_CPUS表示这个系统中cpu对应的号。struct per_cpu_pages pcp[2]这个是我要讲的成员

//我们来看看struct per_cpu_pages 这个结构体的全貌:

struct per_cpu_pages {
   int count;  
   int low;  

   int high; 
   int batch; 

   struct list_head list; 
};

//这个结构体大家都是用“高速缓存内存”来称呼它的,这样说它也是表示一段内存啦!没错,我们对于一页的内存释放和分配的时候就会

//先去这两个内存看看。为什么说是两个内存?因为我们每个zone都会有冷区和热区,zone中的struct per_cpu_pageset[]对应着的

//其中一个cpu的冷区和热区,冷区我们会用pageset[n]->pcp[1],热区我们会用pageset[n]->pcp[0]来表示。我们会想,这个

//per_cpu_pages是怎么表示一段内存呢?我们会发现这里有个链表list,它

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值