bootmem_free_node
该函数设置:
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的更多相关文章
- ARM Linux内核源码剖析索引
start_kernel -->asm-offset.h 生成 -->proc_info_list -->machine_desc -->__vet_atags --> ...
随机推荐
- 基于php缓存的详解
nginx缓存 nginx有两种缓存机制:fastcgi_cache和proxy_cache 下面我们来说说这两种缓存机制的区别吧 proxy_cache作用是缓存后端服务器的内容,可能是任何内容,包 ...
- Object与封装、继承和多态性
Object与封装.继承和多态性 在面向对象编程思想中,无论是C++,Java还是C#等,封装.继承与多态性都有着无与伦比的地位,深入理解并掌握它们是必不可少的.而我将使用C#来浅谈继承与多态性. 1 ...
- WPF自定义分页控件,样式自定义,简单易用
WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...
- [LeetCode]9. Palindrome Number回文数
Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same back ...
- gitk更改主题设置打不开
➜ project git:(master) gitk Error in startup script: unknown color name "lime" (processing ...
- jquery jquery选择器总结 转自(永远的麦子)
jQuery选择器总结 阅读目录 1, 基本选择器? 2, 层次选择器? 3, 过滤选择器? 4, 表单选择器? jQuery选择器共有四大类,分别为基本选择器,层次选择器,过滤选择器和表单选择器.下 ...
- uLua学习之数据交互(三)
前言 在上节中,大概谈了一下如何在lua脚本中调用unity3d中的方法来创建游戏物体,这只是很小的一个方面,uLua的优势在于对unity3d中C#语言的扩展和定制.那么如何扩展和定制呢?其中的数据 ...
- YII2 定义页面提示
控制器里面这样写: 单条消息: 键值是规定好的,不要去自定义哦! \Yii::$app->getSession()->setFlash('error', 'This is the mess ...
- jq实现剪裁图片设置为头像
有时候我们需要设置为这样,就是将某些图片设置为剪裁成设置的尺寸:就是这样的 插件的地址: http://www.htmleaf.com/jQuery/Image-Effects/20150421171 ...
- IOS 绘制画画板(封装上下文)
封装上下文 UIImage (CaptureView).h / .m @interface UIImage (CaptureView) + (UIImage *)captureImageWithVie ...