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