ALIGN MACRO understanding
Mandeep Sandhu
mandeepsandhu.chd at gmail.com
Thu Nov 7 01:36:31 EST 2013
On Thu, Nov 7, 2013 at 11:04 AM, sdptroy3 at gmail.com <sdptroy3 at gmail.com> wrote:
> While going through kernel source , I came across this ALIGN macro
>
> #define ALIGN(x, a) __ALIGN_KERNEL((x), (a))
>
> and
>
> #define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x,
> (typeof(x))(a) - 1)
>
> #define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask))
>
>
> What does this macro do? I have read this article
> http://stackoverflow.com/questions/13122846/align-macro-kernel but it was
> not of much help.
Try the above calculation for a small number, and align it to a 4 byte
boundary. That'll clear things up as to how this macro is working.
So for example, lets align '6' to a '4' byte boundary. This should result in 8.
ALIGN(6, 4) = __ALIGN_KERNEL((6), (4))
__ALIGN_KERNEL(6, 4) = __ALIGN_KERNEL_MASK(6, (typeof(6)) (4) - 1)
typeof(6) is 'int' & 4 - 1 = 3.
__ALIGN_KERNEL_MASK(6, (int) 3) = (((6) + (3)) & ~(3))
Assuming only 4 bits for simplicity):
6 + 3 = 9 = 1001
~3 = 1100
__ALIGN_KERNEL_MASK(6, (int) 3) = (((6) + (3)) & ~(3)) = 1001 & 1100 = 1000 = 8
Since alignment is a power of 2, subtracting 1 from it sets all bits
after the (original) MSB to 1 (eg: 4 = 100 & 3 = 011).
Adding this 'mask' (3) ensures that the resulting number is at least
larger than the next multiple of 'a' that is greater than x (so in our
case 9 > 8, and 8 is a multiple of 4 which is > 6 (x)).
Now bitwise AND-ing with the 1s compliment of mask ensures that all
bits, except the MSB, will be set to 0, thus resulting in a number
aligned at a multiple of 'a'. In our case, the MSB was set when we did
the addition.
Hope this makes it a little clear.
-mandeep
>
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>
More information about the Kernelnewbies
mailing list