pfn_valid(pfn)用于判断page index是否是有效的page。如下所示:
source/include/asm-generic/page.h
#define pfn_valid(pfn) ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
ARCH_PFN_OFFSET 定义在下面的文件中
source/arch/arm/include/asm/memory.h
#define ARCH_PFN_OFFSET PHYS_PFN_OFFSET
继续PHYS_PFN_OFFSET 定义如下
source/arch/arm/include/asm/memory.h
162 #if defined(__virt_to_phys)
163 #define PHYS_OFFSET PLAT_PHYS_OFFSET
164 #define PHYS_PFN_OFFSET ((unsigned long)(PHYS_OFFSET >> PAGE_SHI
135 #define PLAT_PHYS_OFFSET UL(CONFIG_PHYS_OFFSET)
可见PHYS_OFFSET 定义成PLAT_PHYS_OFFSET,而PLAT_PHYS_OFFSET又被定义成CONFIG_PHYS_OFFSET。而CONFIG_PHYS_OFFSET一般是在kernel的defconfig文件中配置的,我们这边平台上定义的是0.也就是第一个page.
所以pfn_valid 定义现在如下:
#define pfn_valid(pfn) ((pfn) >= 0 && ((pfn) < max_mapnr)
我们继续来看max_mapnr的定义。
source/include/linux/mm.h
38 static inline void set_max_mapnr(unsigned long limit)
39 {
40 max_mapnr = limit;
41 }
调用set_max_mapnr 如下:
arch/arm/mm/init.c
477 void __init mem_init(void)
478 {
479 #ifdef CONFIG_HAVE_TCM
480 /* These pointers are filled in on TCM detection */
481 extern u32 dtcm_end;
482 extern u32 itcm_end;
483 #endif
484
485 set_max_mapnr(pfn_to_page(max_pfn) - mem_map);
可见max_mapnr = pfn_to_page(max_pfn) - mem_
pfn_valid 源码分析
于 2016-08-10 10:36:24 首次发布