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 --> ...
随机推荐
- Python编程实现USB转RS485串口通信
---作者吴疆,未经允许,严禁转载,违权必究--- ---欢迎指正,需要源码和文件可站内私信联系--- -----------点击此处链接至博客园原文----------- 功能说明:Python编程 ...
- Maven的学习资料收集--(三)使用Maven构建Web项目
新建Maven项目 File - New - Other 选择Maven Project 单击Next 保持默认即可单击Next 选择Archetype为 web app单击Next 输入一些必要信息 ...
- WPF Virtualization
WPF虚拟化技术分为UI 虚拟化和数据虚拟化 第一种方法被称为"UI 虚拟化".支持虚拟化用户界面的控件是足够聪明来创建只显示的是实际在屏幕上可见的数据项目所需的 UI 元素.例如 ...
- 在浏览器地址栏按回车、F5、ctrl+F5刷新页面的区别
url地址栏里敲击enter:这样的刷新,大家可以在firebug里看一下,只有少数的请求会发送出去,而且几乎没有图片的请求,这是因为请求时会先检查本地是不是缓存了请求的图片,如果有缓存而且没有过期( ...
- visual studio2010中C#生成的,ArcGIS二次开发的basetool的dll,注册为COM组件tlb文件,并在arcmap中加载使用
写了个标题好长啊~~~~ 这两天又认识了一个新玩意,记录一下下,啦啦啦~~~~~ 话说,认识arcgis快十年了,从桌面版到engine的二次开发,其实不过才认识到它的冰山一角, 它总是能带来很多还未 ...
- 【软件使用心得】Quartus和ISE调用Synplify进行综合的问题
分别尝试采用Quartus和ISE调用第三方综合软件Synplify进行综合. [软件版本] Quartus II 13.0 (SP).ISE 14.4 .Synplify 201303. [问题描述 ...
- LeetCode Merge Sorted Array 合并已排序的数组
void merge(int A[], int m, int B[], int n) { int *a=A,*b=B; ,j=; ||m==){ //针对特殊情况,比如A或B中无元素的情况 & ...
- HDU 1085 Holding Bin-Laden Captive! 活捉本拉登(普通型母函数)
题意: 有面值分别为1.2.5的硬币,分别有num_1.num_2.num_5个,问不能组成的最小面值是多少?(0<=每种硬币个数<=1000,组成的面值>0) 思路: 母函数解决. ...
- Cygwin 下的 自动安装工具 apt-cyg
类似 于apt-get 或者 yum Cygwin可以在Windows下使用unix环境Bash和各种功能强大的工具,对于Linux管理员来说不想使用Linux桌面是必备的工具. Cygwin下也有类 ...
- Wired Memory
https://developer.apple.com/library/content/documentation/Performance/Conceptual/ManagingMemory/Arti ...