程式的目的是針對給定的 alignment 數值,輸出大於等於 alignment 的記憶體對齊地址。但當 alignment 為二的冪次時可以透過數字的特性來作
二的冪次的特性為
如下:
接著可以透過可以透過 sz + mask 來判斷是否 sz 是否需要向上對齊。 若 mask 對應的位元任一數為 1 則代表 sz 許要向上取 alignment 的倍數,反之則不需要。
相加之後需要透過與 ~mask 做 && 來清除多餘的位元。
舉例來說假設輸入的 sz = 17, alignment = 4 。 預期輸出的數值為 20 。
17 的二位元表示為
4 的二位元表示則為
mask
17 + mask
(17 + mask) & ~mask
可以看到結果如同預期。
從 Linux 的 const.h
可以看到 __ALIGN_KERNEL(x, a)
這個 macro 定義另一個 macro __ALIGN_KERNEL_MASK(x, (__typeof__(x))(a) - 1)
而 __ALIGN_KERNEL_MASK
本身定義的函式則為 (((x) + (mask)) & ~(mask))
。
相關的用法可以在 ioam6_parser.c
的 static int check_ioam6_data(__u8 **p, struct ioam6_trace_hdr *ioam6h, const struct ioam_config cnf)
中看到透過 __ALIGN_KERNEL
將 len 以 4 向上對齊。