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
。
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
#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,让他们看一看。
我最近在探索 Linux 内核中的对齐机制,然而,我对两个宏感到困惑,它们是 ALIGN()
和 round_up()
,它们有不同的实现但是相同的目的(据我所知),就是将 2^n 字节向上舍入。
我很好奇为什么他们需要两个具有不同实现但相同输出的宏。
此外,它们都在同一个头文件中,include/linux/kernel.h
。
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
#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,让他们看一看。