alignmentmacros内核

我无法理解这个macros是什么。 这些是在linux-kernel中定义的,但是我的疑问是独立于此的。 我无法理解(((x)+(mask))&~(mask))行是干什么的。

 #define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) #define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) 

任何帮助赞赏。

假设你有一个数字: 0x1006

由于某些原因,您希望将其与4个字节的边界对齐。

用一个4字节的边界,你知道对齐的值是0x1008等。然后你也知道0x1006的对齐值是0x1008

你将如何得到0x1008 ? 对齐值4的对齐掩码是(4 - 1) = 0x03

现在0x1006 + 0x03 = 0x10090x1009 & ~0x03 = 0x1008

这个操作是__ALIGN_MASK宏。

如果你想传递值4 (对齐)而不是直接0x03 (对齐掩码),你有ALIGN

 #define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) 

对齐方式a被转换为x的类型,然后减去一个。 对齐应该是2的幂,从而产生许多x型的位模式00..011..11 ,掩码(如果a = 2^k ,则k 1s)。

然后

 #define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) 

将该掩码的值添加到x ,使得(x)+ (mask)至少与不小于x且小于下一个较大倍数的对齐的最小倍数一样大。 然后,该掩码的逐位和补码将该数量减少到该对齐的倍数。

对于2^k - 1形式的掩码,计算

 (x + mask) & ~mask 

是相同的

 (x + 2^k - 1) - ((x + 2^k - 1) % (2^k)) 

要么

 ((x + 2^k - 1)/(2^k)) * (2^k)