Linux PAGE_ALIGN 宏定义的理解

前言

  • 最近再阅读 Linux ion(一种内存分配管理)时,遇到了 PAGE_ALIGN 宏,这个宏到底是怎么工作的? 【页对齐】时什么意思? 页大小就是 4096 吗?

追踪 PAGE_ALIGN

  • 通过一步一步的追踪,终于了解了 PAGE_ALIGN 宏的最终展开定义。其实就是 PAGE_SIZE 对齐,Linux 上默认是 4096

  • 源头: Linux 内核 drivers\staging\android\ion\ion_buffer.c -> ion_buffer_alloc

Linux PAGE_ALIGN 宏定义的理解_第1张图片

Linux PAGE_ALIGN 宏定义的理解_第2张图片

  • PAGE_ALIGN 的定义 include\linux\mm.h
/* to align the pointer to the (next) page boundary */
#define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE)
  • arch\arc\include\uapi\asm\page.h -> PAGE_SIZE 的定义: 4096 的来源 1<<12

Linux PAGE_ALIGN 宏定义的理解_第3张图片

  • include\linux\kernel.h ALIGN 的定义实现

  • 继续展开: include\uapi\linux\const.h,获取 PAGE_ALIGN 的最终实现

Linux PAGE_ALIGN 宏定义的理解_第4张图片

Linux PAGE_ALIGN 宏定义的理解_第5张图片

  • PAGE_ALIGN 的展开

((((len)) + ((typeof((len)))(((((1UL)) << (12)))) - 1)) & ~((typeof((len)))(((((1UL)) << (12)))) - 1))

  • 可以同时看到 mask (掩码)的巧妙获取,比如 PAGE_SIZE - 1

小结

  • 重视细节,掌握全局,认真阅读,勤做笔记

  • Linux 技术非常的使用,多研究,获取更多

你可能感兴趣的:(嵌入式Linux,1024程序员节,PAGE_SIZE,PAGE_ALIGN)