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

C Linux内核中ALIGN()和round_up()宏的区别,c,linux-kernel,memory-alignment,C,Linux Kernel,Memory Alignment,我最近在探索Linux内核中的对齐机制,但是,我被两个宏搞糊涂了,它们是ALIGN()和round\u(),它们有不同的实现,但目的相同(据我所知),即进行2^n字节的取整 我很好奇为什么他们需要两个具有不同impl但输出相同的宏 而且,它们都在同一个头文件中,include/linux/kernel.h : #定义uuu圆形遮罩(x,y)((uuuu类型的uuuuux))((y)-1)) #定义舍入(x,y)(((x)-1)|舍入(x,y))+1) : #定义"对齐"内核(x,a)"对齐"内

我最近在探索Linux内核中的对齐机制,但是,我被两个宏搞糊涂了,它们是
ALIGN()
round\u()
,它们有不同的实现,但目的相同(据我所知),即进行2^n字节的取整

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

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

:

#定义uuu圆形遮罩(x,y)((uuuu类型的uuuuux))((y)-1))
#定义舍入(x,y)(((x)-1)|舍入(x,y))+1)
:

#定义"对齐"内核(x,a)"对齐"内核(x)(typeof(x)(a)-1)
#定义内核掩码(x,掩码)(((x)+(掩码))&~(掩码))
#定义ALIGN(x,a)uu ALIGN_内核((x),(a))

谢谢

它们不再位于同一标题中<代码>\uuu ALIGN\u内核*()现在是UAPI的一部分。但我想主要的区别是:

a)实施方式和

b)历史原因,即(“向上/向下移动到kernel.h”)simple的作者没有找到
ALIGN()
的对应项,该对应项出现在后面的通用标题中(“linux/kernel.h:Add ALIGN\u down macro”)


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

@Tsyvarev感谢您的回复。你能说得更具体些吗?AFAIK甚至测试过(因为我怀疑自己的理解),
round\u
ALIGN
都返回了
a
y
上的下一个可除数。抱歉,我错误地解释了
round\u
的描述。明白了,我会尝试找到他们。谢谢你的解释!