该函数设置:

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. 基于php缓存的详解

    nginx缓存 nginx有两种缓存机制:fastcgi_cache和proxy_cache 下面我们来说说这两种缓存机制的区别吧 proxy_cache作用是缓存后端服务器的内容,可能是任何内容,包 ...

  2. Object与封装、继承和多态性

    Object与封装.继承和多态性 在面向对象编程思想中,无论是C++,Java还是C#等,封装.继承与多态性都有着无与伦比的地位,深入理解并掌握它们是必不可少的.而我将使用C#来浅谈继承与多态性. 1 ...

  3. WPF自定义分页控件,样式自定义,简单易用

    WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...

  4. [LeetCode]9. Palindrome Number回文数

    Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same back ...

  5. gitk更改主题设置打不开

    ➜ project git:(master) gitk Error in startup script: unknown color name "lime" (processing ...

  6. jquery jquery选择器总结 转自(永远的麦子)

    jQuery选择器总结 阅读目录 1, 基本选择器? 2, 层次选择器? 3, 过滤选择器? 4, 表单选择器? jQuery选择器共有四大类,分别为基本选择器,层次选择器,过滤选择器和表单选择器.下 ...

  7. uLua学习之数据交互(三)

    前言 在上节中,大概谈了一下如何在lua脚本中调用unity3d中的方法来创建游戏物体,这只是很小的一个方面,uLua的优势在于对unity3d中C#语言的扩展和定制.那么如何扩展和定制呢?其中的数据 ...

  8. YII2 定义页面提示

    控制器里面这样写: 单条消息: 键值是规定好的,不要去自定义哦! \Yii::$app->getSession()->setFlash('error', 'This is the mess ...

  9. jq实现剪裁图片设置为头像

    有时候我们需要设置为这样,就是将某些图片设置为剪裁成设置的尺寸:就是这样的 插件的地址: http://www.htmleaf.com/jQuery/Image-Effects/20150421171 ...

  10. IOS 绘制画画板(封装上下文)

    封装上下文 UIImage (CaptureView).h / .m @interface UIImage (CaptureView) + (UIImage *)captureImageWithVie ...