有時候需要將一個值或是 address alignment 到一個 boundary , 最常見的就是 alignment to 4KB, 也就是一個 page 的 boundary.
Linux kernel 使用 PAGE_ALIGN(addr) 這個 macro 來處理
/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT 12
#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT)
#define PAGE_MASK (~(PAGE_SIZE-1))
/* to align the pointer to the (next) page boundary */
#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)
可以小小改寫成
#define SIZE_ALIGN(addr, size) (((addr)+size-1)&(~(size-1)))
昨天就遇到一個問題..需要將一個值 alignment 到 32bit 的 boundary
就可以這樣子做
SIZE_ALIGN(addr, 32)
我的小樹
16 年前
沒有留言:
張貼留言