该函数设置:

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. JAVA 集合类小结

    一 集合和数组 因为本人也是个go的爱好者,所以对于集合类算是摸的比较透的. 说到集合,必须了解数组和集合. Java的数组长度固定,集合长度不定.集合是特定的数据结构的集合. 而go里面并没有集合, ...

  2. Java排序算法(二)

    java排序算法(二) 二.改进排序算法 2.1希尔排序 定义:希尔排序(ShellSort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. ...

  3. ORACLE比较两个数据库的表结构

    create table ESPACE_TABLE( TABLE_NAME VARCHAR2(100) not null) create table ESPACE_COLUMN( TABLE_NAME ...

  4. iOS开发ReactiveCocoa学习笔记(六)

    RAC操作方法三. demo地址:https://github.com/SummerHH/ReactiveCocoa.git doNext deliverOn timeout interval del ...

  5. NOIP2013Day1T3 表示只能过一个点

    •A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的 ...

  6. Android 在已有工程中实现微信图片压缩

    这个我们需要自己去编译,但是已经有人帮我们编译好了,压缩算法也已经实现,因此,我们去下载然后编译即可:https://github.com/bither/bither-android-lib 首先将上 ...

  7. C# 获取当前文件、文件夹的路径及操作环境变量

    一.获取当前文件的路径 1.   System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName      获取模块的完整路径,包 ...

  8. iOS JS 交互之利用系统JSContext实现 JS调用OC方法以及Objective-C调用JavaScript方法

    ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择拷贝到工程中,(拖入的文件夹是蓝色 ...

  9. 初识ListView - 定制ListView - 提升ListView运行效率

    ListView绝对可以称得上是 Android 中最常用的控件之一,几乎所有的应用程序都会用到它.由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示的 ...

  10. Mac Office 2016 卸载

    https://support.office.com/zh-cn/article/%E5%8D%B8%E8%BD%BD-Office-2016-for-Mac-eefa1199-5b58-43af-8 ...