对齐宏内核

Ama*_*tam 12 c linux operators bitwise-operators linux-kernel

我无法理解这个宏的作用.这些是定义,linux-kernel但我怀疑是独立的.我无法理解(((x)+(mask))&~(mask))线路的作用.

#define ALIGN(x,a)              __ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask)    (((x)+(mask))&~(mask))
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏.

oua*_*uah 24

说你有一个号码: 0x1006

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

随着4字节的边界,你知道对齐值0x1000,0x1004,0x1008,等等,那么你也知道的对齐值0x10060x1008.

你怎么样的0x1008?对齐值的对齐掩码4(4 - 1) = 0x03

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

此操作是 __ALIGN_MASK宏.

如果要传递值4(对齐)而不是直接传递0x03(对齐掩码),则可以使用ALIGN


Dan*_*her 11

#define ALIGN(x,a)              __ALIGN_MASK(x,(typeof(x))(a)-1)
Run Code Online (Sandbox Code Playgroud)

对齐,a被转换为x类型,然后减去一个.取向应是2的幂,所以,在许多的位模式的结果00..011..11x的类型,掩模(k1S如果a = 2^k).

然后

#define __ALIGN_MASK(x,mask)    (((x)+(mask))&~(mask))
Run Code Online (Sandbox Code Playgroud)

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

对于表单的掩码2^k - 1,计算

(x + mask) & ~mask
Run Code Online (Sandbox Code Playgroud)

是相同的

(x + 2^k - 1) - ((x + 2^k - 1) % (2^k))
Run Code Online (Sandbox Code Playgroud)

要么

((x + 2^k - 1)/(2^k)) * (2^k)
Run Code Online (Sandbox Code Playgroud)