2009年3月17日 星期二

alignment to xxx ~~~

有時候需要將一個值或是 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)

沒有留言:

張貼留言