16

このマクロが何をするのか理解できません。これらはで定義されてlinux-kernelいますが、私の疑問はそれとは無関係です。line が何をするのか理解できません(((x)+(mask))&~(mask))

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

どんな助けでも感謝します。

4

2 に答える 2

30

あなたが番号を持っているとしましょう:0x1006

4何らかの理由で、バイト境界に合わせたいとします。

4 バイト境界では、アラインされた値が0x10000x10040x1008などであることがわかります。また、アラインされた値が であることがわかり0x1006ます0x1008

どのように取得し0x1008ますか? アライメント値のアライメント マスク4(4 - 1) = 0x03

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

この操作が __ALIGN_MASKマクロです。

4直接0x03(アラインメント マスク)ではなく値 (アラインメント) を渡したい場合は、ALIGNマクロがあります。

于 2012-10-29T14:18:38.230 に答える
11
#define ALIGN(x,a)              __ALIGN_MASK(x,(typeof(x))(a)-1)

アラインメントaは の型にキャストされx、次に 1 が減算されます。アラインメントは 2 のべき乗である必要があります。これにより、 のタイプのビット パターンの数00..011..11xマスク ( 1 のk場合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)
于 2012-10-29T13:53:54.337 に答える