对齐宏内核

时间:2012-10-29 13:46:00

标签: c linux linux-kernel operators bitwise-operators

我无法理解这个宏的作用。这些在linux-kernel中定义,但我怀疑与此无关。我无法理解(((x)+(mask))&~(mask))行的作用。

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

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:22)

假设您有一个号码:0x1006

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

对于4字节边界,您知道对齐的值为0x10000x10040x1008等。 然后,您还知道0x1006的对齐值为0x1008

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

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

此操作是__ALIGN_MASK宏。

如果您想传递值4(对齐)而不是直接传递0x03(对齐蒙版),则您拥有ALIGN

答案 1 :(得分:11)

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

对齐a会转换为x的类型,然后减去一个。对齐应该是2的幂,因此导致00..011..11类型的位模式x的数量,掩码(k 1s a = 2^k )。

然后

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

{{1}}