如何理解内核中"page_align"的宏?

lxg*_*eek 1 linux kernel

代码是:

#define PAGE_SHIFT      12
#define PAGE_SIZE       (1UL << PAGE_SHIFT)
#define PAGE_MASK       (~(PAGE_SIZE-1))

#define PAGE_ALIGN(addr)        (((addr)+PAGE_SIZE-1)&PAGE_MASK)
Run Code Online (Sandbox Code Playgroud)

我知道这个marco会在页面边界上对齐任何地址.
如何理解这个工具

Bas*_*tch 5

通过addr向其添加4095(即2 12 -1)并清除最低12位,它向上舍入到4096的下一个倍数(即2 12)