pfn_valid 源码分析

 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_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值