该函数设置:

1.pgdata节点的成员

2.pgdata->zone的成员

3.初始化zone->free_area

4.初始化zone所包含的所有页对应的页框描述符page结构体

/*
为buddy系统设置为无可用的页。
初始化zone->free_area,设置为buddy系统中没有可用的页框。
*/
static void __init bootmem_free_node(int node, struct meminfo *mi)
-->.计算各个zone中的有效页框数及全部页框数(含空洞)
-->free_area_init_node(node, zone_size, start_pfn, zhole_size);
-->设置pglist_data结构体的成员(pgdat->node_start_pfn,node_spaned_pages,node_present_pages)
/*
为节点中的每一个页分配一个页框描述符page结构体,这些结构体所占用的内存
调用bootmem分配器的API分配,alloc_bootmem_node
*/
-->alloc_node_mem_map(pgdat);
-->free_area_init_core(pgdat, zones_size, zholes_size);
-->unsigned long __meminitdata nr_kernel_pages;//内核可用的所有页框数
-->unsigned long __meminitdata nr_all_pages;//所有页框数
-->设置zone结构体的成员
-->zone_pcp_init(zone);//初始化每CPU的冷热页缓存
//把多个页框组织为一个pageblock,每个pageblock用几bit标记,为所有标记分配内存
-->setup_usemap(pgdat, zone, size);
-->init_currently_empty_zone(zone, zone_start_pfn,size, MEMMAP_EARLY);
-->设置pglist_data->nr_zone
-->zone_init_free_lists(zone);//初始化zone->free_area。设置为无空闲页可用
-->memmap_init(size, nid, j, zone_start_pfn);
-->memmap_init_zone((size), (nid), (zone), (start_pfn), MEMMAP_EARLY)
-->unsigned long highest_memmap_pfn//最大的页框号,线性映射区
-->struct page *page = pfn_to_page(pfn);
-->set_page_links(page, zone, nid, pfn);//设置page->flags
-->init_page_count(page);//page->_ncount=1
-->reset_page_mapcount(page); //page->_mapcount=-1
-->SetPageReserved(page); //设置page->flags PG_reserved位

注意上面的SetPageReserved(page)在代码中搜索不到该函数,在include/linux/page_flags.h中有下列宏用于定义page->flags相关的操作函数。

/*
* Macros to create function definitions for page flags
*/
#define TESTPAGEFLAG(uname, lname) \
static inline int Page##uname(struct page *page) \
{ return test_bit(PG_##lname, &page->flags); } #define SETPAGEFLAG(uname, lname) \
static inline void SetPage##uname(struct page *page) \
{ set_bit(PG_##lname, &page->flags); } #define CLEARPAGEFLAG(uname, lname) \
static inline void ClearPage##uname(struct page *page) \
{ clear_bit(PG_##lname, &page->flags); }

bootmem_free_node的更多相关文章

  1. ARM Linux内核源码剖析索引

    start_kernel -->asm-offset.h 生成 -->proc_info_list   -->machine_desc -->__vet_atags --> ...

随机推荐

  1. Maven的学习资料收集--(六) 构建Hibernate项目

    前面我们使用Maven构建了Struts2项目,这里我们来试一下Hibernate项目: 这里的例子,大体框架应该是正确的,但是,对于Maven的很多约定都没有掌握,估计包的命名都不是非常好,等以后, ...

  2. Swift网络库Alamofire的导入

    一.手动导入 1, 官网下载 Alamofire 2, 解压下载的文件 放入工程的顶层目录下 3, 打开工程 Add Files 4, 选中项目 TARGETS > General > E ...

  3. ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第十二天(非原创)

    文章大纲 一.课程介绍二.Ngnix基础知识学习三.Ngnix在淘淘商城中使用四.参考资料下载五.参考文章 一.课程介绍 一共14天课程(1)第一天:电商行业的背景.淘淘商城的介绍.搭建项目工程.Sv ...

  4. 面试(Java之IO与NIO)

    一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...

  5. 本地添加Maven管理

    Maven下载安装: 1 .Maven下载地址:http://maven.apache.org/ 2 .下载解压到本地指定目录:记住该路径! 3 .新建/修改环境变量-系统变量: 名:M2_HOME ...

  6. Java并发基础:线程的创建

    线程的创建和管理: 1.应用Thread类显式创建.管理线程 2.应用Executor创建并管理线程. 定义任务: 无返回的任务:实现Runnable接口并编写run()方法. 有响应的任务:实现Ca ...

  7. Visual Studio 2017 如何打开Model Browser(实体数据模型浏览器)

    写一个笔记,记录下在Visual Studio 2017中打开EF模型浏览器的步骤和方法,方便以后忘记了可以重新查阅.主要是现在VS功能越来越多,很多功能模块/界面要开启都是有先决条件,总之隐藏的很深 ...

  8. 巧用netsh命令实现端口转发(端口映射)不求人

    好处:即时生效,随意修改删除,不影响其他ip映射 记事本保存为bat格式批量添加后,并查看映射: netsh interface portproxy add v4tov4 listenport=701 ...

  9. 美国绿卡基础知识:I-539和I-129表格的应用回复新帖

    美国绿卡基础知识:I-539和I-129表格的应用 发布于: 2011/07/25  8:43 am 引用     I-539,就是和万金油类似的表格.不管你是要延期,还是转换身份:不管你是 B-2 ...

  10. Visual Studio 2015简体中文版

    Visual Studio  2015简体中文版(企业版) http://download.microsoft.com/download/B/8/F/B8F1470D-2396-4E7A-83F5-A ...