前言
- 最近再阅读 Linux ion(一种内存分配管理)时,遇到了
PAGE_ALIGN
宏,这个宏到底是怎么工作的? 【页对齐】时什么意思? 页大小就是 4096 吗?
追踪 PAGE_ALIGN
-
通过一步一步的追踪,终于了解了 PAGE_ALIGN 宏的最终展开定义。其实就是
PAGE_SIZE
对齐,Linux 上默认是 4096 -
源头: Linux 内核
drivers\staging\android\ion\ion_buffer.c -> ion_buffer_alloc
- 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
-
include\linux\kernel.h
ALIGN 的定义实现 -
继续展开:
include\uapi\linux\const.h
,获取 PAGE_ALIGN 的最终实现
- PAGE_ALIGN 的展开
((((len)) + ((typeof((len)))(((((1UL)) << (12)))) - 1)) & ~((typeof((len)))(((((1UL)) << (12)))) - 1))
- 可以同时看到 mask (掩码)的巧妙获取,比如 PAGE_SIZE - 1
小结
-
重视细节,掌握全局,认真阅读,勤做笔记
-
Linux 技术非常的使用,多研究,获取更多