linux pfn,ARM Linux下的page和pfn之间转换的宏。

ARM Linux下的page和pfn之间转换的宏如下:

1)page_to_pfn

2)pfn_to_page

这两个宏依赖于内核编译时,选择的内存模型。在include/asm-generic/memory_model.h文件中定义了这两个宏。

include/asm-generic/memory_model.h

1 #ifndef __ASM_MEMORY_MODEL_H

2 #define __ASM_MEMORY_MODEL_H

3

4 #ifndef __ASSEMBLY__

5

6 #if defined(CONFIG_FLATMEM)

7

8 #ifndef ARCH_PFN_OFFSET

9 #define ARCH_PFN_OFFSET         (0UL)

10 #endif

11

12 #elif defined(CONFIG_DISCONTIGMEM)

13

14 #ifndef arch_pfn_to_nid

15 #define arch_pfn_to_nid(pfn)    pfn_to_nid(pfn)

16 #endif

17

18 #ifndef arch_local_page_offset

19 #define arch_local_page_offset(pfn, nid)        \

20         ((pfn) - NODE_DATA(nid)->node_start_pfn)

21 #endif

22

23 #endif /* CONFIG_DISCONTIGMEM */

24

25 /*

26  * supports 3 memory models. 27  */

28 #if defined(CONFIG_FLATMEM)

29

30 #define __pfn_to_page(pfn)      (mem_map + ((pfn) - ARCH_PFN_OFFSET))

31 #define __page_to_pfn(page)     ((unsigned long)((page) - mem_map) + \

32                                  ARCH_PFN_OFFSET) 33 #elif defined(CONFIG_DISCONTIGMEM)

34

35 #define __pfn_to_page(pfn)                      \

36 ({      unsigned long __pfn = (pfn);            \

37         unsigned long __nid = arch_pfn_to_nid(__pfn);  \

38         NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\

39 })

40

41 #define __page_to_pfn(pg)                                               \

42 ({      struct page *__pg = (pg);                                       \

43         struct pglist_data *__pgdat = NODE_DATA(page_to_nid(__pg));     \

44         (unsigned long)(__pg - __pgdat->node_mem_map) +                 \

45          __pgdat->node_start_pfn;                                       \

46 })

47

48 #elif defined(CONFIG_SPARSEMEM_VMEMMAP)

49

50 /* memmap is virtually contiguous.  */

51 #define __pfn_to_page(pfn)      (vmemmap + (pfn))

52 #define __page_to_pfn(page)     (unsigned long)((page) - vmemmap)

53

54 #elif defined(CONFIG_SPARSEMEM)

55 /*

56  * Note: section's mem_map is encorded to reflect its start_pfn.

57  * section[i].section_mem_map == mem_map's address - start_pfn;

58  */

59 #define __page_to_pfn(pg)                                       \

60 ({      struct page *__pg = (pg);                               \

61         int __sec = page_to_section(__pg);                      \

62         (unsigned long)(__pg - __section_mem_map_addr(__nr_to_section(__sec))); \

63 })

64

65 #define __pfn_to_page(pfn)                              \

66 ({      unsigned long __pfn = (pfn);                    \

67         struct mem_section *__sec = __pfn_to_section(__pfn);    \

68         __section_mem_map_addr(__sec) + __pfn;          \

69 })

70 #endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */

71

72 #define page_to_pfn __page_to_pfn

73 #define pfn_to_page __pfn_to_page 74

75 #endif /* __ASSEMBLY__ */

76

77 #endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值