find_node_limits
来源:互联网 发布:java接收trap的引擎id 编辑:程序博客网 时间:2024/06/18 08:50
本人刚开始学linux内核,有理解错误地方欢迎指正!
内核版本2.6.32.2
#define PAGE_SHIFT12#define PAGE_SIZE(_AC(1,UL) << PAGE_SHIFT) /*=4KB*/#define PAGE_MASK(~(PAGE_SIZE-1)) /*=0xffff f000*/#define__phys_to_pfn(paddr)((paddr) >> PAGE_SHIFT)#define bank_pfn_start(bank)__phys_to_pfn((bank)->start)#define bank_pfn_end(bank)__phys_to_pfn((bank)->start + (bank)->size)
上面这两个宏分别获取该bank上的起始页帧号和结束页帧号.
假如某个bank上内存的起始地址为:0x30000000,大小为:16MB,那么
宏bank_pfn_start获取到的值为:0x30000000 >> 12 = 0x30000
宏bank_pfn_end获取到的值为:(0x30000000 + 0x1000000) >> 12 = 0x31000
Linux管理内存的最小单元为页(page),通过上面的宏PAGE_SIZE可以知道一个页的大小为4KB,
所以一个大小为16MB的内存可以划分出16M/4K=0x1000个页,而页帧号就相当于是这些页的索引,
可以想象成这个大小为16MB的内存就像是一个数组,这个数组有0x1000个元素,每个元素的大小
为4KB.
+-------------+-------------+--------------+-------------+
| 4KB | ... | ... | 4KB |
+-------------+-------------+--------------+-------------+
static void __init find_node_limits(int node, struct meminfo *mi,unsigned long *min, unsigned long *max_low, unsigned long *max_high){int i;*min = -1UL;*max_low = *max_high = 0;/*遍历该节点中的所有bank*/for_each_nodebank(i, mi, node) {struct membank *bank = &mi->bank[i];unsigned long start, end;/*获取该bank上的起始页帧号和结束页帧号*/start = bank_pfn_start(bank);end = bank_pfn_end(bank);/*min表示该节点(node)上的起始页帧号max_high表示该节点(node)上的高端内存的最大页帧号max_low表示该节点(node)上的低端内存的最大页帧号*/if (*min > start)*min = start;if (*max_high < end)*max_high = end;if (bank->highmem)continue;if (*max_low < end)*max_low = end;}}
综上所述,该函数的作用就是遍历该节点中的所有bank,从而计算出
起始页帧号、高端内存的最大页帧号和低端内存的最大页帧号,并将
它们分别保存在变量min, max_high 和max_low 中,返回给主调函数。
0 0
- find_node_limits
- OCP-1Z0-051 第113题 GROUP BY, TO_CHAR的应用
- Ubuntu设置环境变量并立即生效
- PHP后门新玩法:一款猥琐的PHP后门分析
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- 修改文件权限
- find_node_limits
- SCADACLOUD智能平台实现技术
- 命令行方式读取WEB页面
- Ubuntu中root用户和user用户的相互切换
- edit binary file via vim -b
- Ext.Net学习笔记02:Ext.Net用法概览
- java日期工具类
- SQL产生随机数函数记录
- android:configChanges属性