本文参考Linux-4.1.15
Linux通过PAGE_ALIGN(addr)将addr加大对齐到4096字节的边界(4096的整数倍),假设addr=4096+n,{0<n<4096},则执行PAGE_ALIGN(addr)后,addr=4096+4096
PAGE_ALIGN这个宏在include/linux/mm.h中,
/* to align the pointer to the (next) page boundary */
#define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE)
同时Linux中如下定义:
#define ALIGN(x, a) __ALIGN_KERNEL((x), (a))
#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask))
PAGE_ALIGN(addr)等价于:(addr+(PAGE_SIZE-1)) & ~(PAGE_SIZE-1)
假设PAGE_SIZE=4096,即1 0000 0000 0000(b),则(PAGE_SIZE-1) = 1111 1111 1111(b),~(PAGE_SIZE-1)=0000 0000