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

void __init mem_init(void)
{
   unsigned int codepages, datapages, initpages;
   int i, node;

 

  codepages = &_etext - &_text;//内核代码段的大小。
  datapages = &_end - &__data_start;//内核数据段的大小。
  initpages = &__init_end - &__init_begin;//内核初始化相关函数指针空间段的大小。

 

 #ifndef CONFIG_DISCONTIGMEM//如果系统内存空间连续的话。
        max_mapnr   = virt_to_page(high_memory) - mem_map;//max_mapnr保存着最大低端内存页数。
 #endif

 if (meminfo.nr_banks != 1)//如果bank不止一个,说明可能存在内存孔洞。
       create_memmap_holes(&meminfo);//对每个node的bank进行检查,只要发现前后属于这个node的相邻bank的收尾页号不一

                                                               //样的时候,我们就调用free_memmap(),这个函数首先通过页号转换成这两个页对应的

                                                               //struct page所在的虚拟地址,然后使这两个虚拟转换成物理地址,并且进行按页对齐,

                                                               //最后调用free_bootmem_node()这个函数,使两页之间的页对应的页帧位码表中的相应

                                                               //位为0.

  for (node = 0; node < numnodes; node++) {//遍历所有节点

       pg_data_t *pgdat = NODE_DATA(node);

      

       if (pgdat->node_spanned_pages != 0)

                 totalram_pages += free_all_bootmem_node(pgdat);//totalram_pages保存释放出低端内存的总页数,我们接下来

                                                                                           //看看free_all_bootmem_node()是如何释放不必要的内存的。

  }

  unsigned long __init free_

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值