1

我最近正在探索 Linux 内核中的对齐机制,但是,我对两个宏感到困惑,它们是ALIGN()round_up(),它们具有不同的实现但相同的目的(据我的理解),即 2^n 字节向上舍入.

我很好奇他们需要两个具有不同 impl 但输出相同的宏的原因。

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

的实施round_up()

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

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

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))

谢谢!

4

1 回答 1

1

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

a)略有不同的实现和

b)历史原因,即9b3be9f99203 ("Move round_up/down to kernel.h")的作者ALIGN()在ed067d4a859f ("linux/kernel.h: Add ALIGN_DOWN 宏")

我建议向 LKML 发送一封电子邮件,其中包含上述提交的作者 Kees Cook,也许还有其他人请他们看一看。

于 2019-09-29T12:10:32.653 回答