• [linux内存]伙伴系统学习笔记(二)--内存系统初始化


    1,本文大部分来自:http://blog.csdn.net/vanbreaker/article/details/7611585

    2,在start_kernel()-->paging_init()-->zone_sizes_init()-->free_area_init_nodes()-->free_area_init_node()-->free_area_init_core()-->init_currently_empty_zone()->zone_init_free_lists()中,free_area的相关域都被初始化

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. static void __meminit zone_init_free_lists(struct zone *zone)    
    2. {    
    3.     int order, t;    
    4.     for_each_migratetype_order(order, t) {    
    5.         /*链表初始化为空链表*/    
    6.         INIT_LIST_HEAD(&zone->free_area[order].free_list[t]);    
    7.         /*内存块数量初始化为0*/    
    8.         zone->free_area[order].nr_free = 0;    
    9.     }    
    10. }   



    start_kernel()-->mm_init()-->mem_init(),负责统计所有可用的低端内存和高端内存,并释放到伙伴系统中

    在free_area_init_core()-->memmap_init()(-->memmap_init_zone() )-->set_pageblock_migratetype(),将每个pageblock的起始页框对应的struct zone当中的pageblock_flags代表的位图相关区域标记为可移动的,表示该pageblock为可移动的,也就是说内核初始化伙伴系统时,所有的页都被标记为可移动的

    在内核首先通过setup_arch()-->paging_init()-->zone_sizes_init()来初始化节点和管理区的一些数据项其中核心函数为free_area_init_node(),用来针对特定的节点进行初始化

    至此,节点和管理区的关键数据已完成初始化,内核在后面为内存管理做得一个准备工作就是将所有节点的管理区都链入到zonelist中,便于后面内存分配工作的进行内核在start_kernel()-->build_all_zonelist()中完成zonelist的初始化

  • 相关阅读:
    吃推荐3个最近去了的好地方
    30岁生日
    今天开始试用Briglow Hair Cream
    WPF中如何在文本外面加虚线外框
    对账算法改进
    如何退出正在Sleep的线程
    关于framework4.5的相关介绍
    恐怖的报警邮件
    对帐引擎2个月后的监控数据
    wcf rest服务启用gzip压缩
  • 原文地址:https://www.cnblogs.com/zhiliao112/p/4251210.html
Copyright © 2020-2023  润新知