Linux 内核中 ALIGN() 和 round_up() 宏的区别

Difference of ALIGN() and round_up() macro in the Linux kernel

我最近在探索 Linux 内核中的对齐机制,然而,我对两个宏感到困惑,它们是 ALIGN()round_up(),它们有不同的实现但是相同的目的(据我所知),就是将 2^n 字节向上舍入。

我很好奇为什么他们需要两个具有不同实现但相同输出的宏。

此外,它们都在同一个头文件中,include/linux/kernel.h

Impl of round_up():

#define __round_mask(x, y) ((__typeof__(x))((y)-1))

#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)

Impl of ALIGN():

#define __ALIGN_KERNEL(x, a)        __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
#define __ALIGN_KERNEL_MASK(x, mask)    (((x) + (mask)) & ~(mask))

#define ALIGN(x, a)     __ALIGN_KERNEL((x), (a))

谢谢!

它们不再在同一个标​​题中。 __ALIGN_KERNEL*() 现在是 UAPI 的一部分。但我猜的主要区别是:

a)

的实现略有不同

b)历史原因,即9b3be9f99203 ("Move round_up/down to kernel.h") simple hadn't found the counterpart to ALIGN() which appears in the generic headers later, in ed067d4a859f的作者("linux/kernel.h: Add ALIGN_DOWN macro").

我建议将上述提交的作者 Kees Cook 和其他人一起发邮件给 LKML,让他们看一看。