我最近正在探索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)
:
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))
现在是UAPI的一部分。但我猜主要区别是:
[a)