alinear núcleo macro

2 minutos de lectura

avatar de usuario
Aman Profundo Gautama

No puedo entender lo que hace esta macro. Estos se definen en linux-kernel pero mi duda es independiente de eso. No puedo entender lo que significa (((x)+(mask))&~(mask)) la línea lo hace.

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

Cualquier ayuda apreciada.

Digamos que tienes un número: 0x1006

Por alguna razón, desea alinearlo con un 4 límite de bytes.

Con un límite de 4 bytes, sabe que los valores alineados son 0x1000, 0x1004, 0x1008etc. Entonces también conoce el valor alineado de 0x1006 es 0x1008.

¿Cómo obtendrías 0x1008? La máscara de alineación para el valor de alineación 4 es (4 - 1) = 0x03

Ahora 0x1006 + 0x03 = 0x1009 y 0x1009 & ~0x03 = 0x1008

Esta operación es la __ALIGN_MASK macro.

Si quieres pasar el valor 4 (la alineación) en lugar de directamente 0x03 (la máscara de alineación), tienes la ALIGN macro

  • Una explicación muy sucinta que es fácil de seguir.

    – David Hu

    15 de noviembre de 2021 a las 3:10

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

la alineación, ase lanza a xde tipo, y luego se resta uno. La alineación debe ser una potencia de 2, por lo que da como resultado un número del patrón de bits 00..011..11 de xtipo de , la máscara (k 1s si a = 2^k).

Después

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

suma el valor de la máscara a xde modo que (x)+ (mask) es al menos tan grande como el múltiplo más pequeño de la alineación que no es más pequeño que x y menor que el siguiente múltiplo mayor. Luego el bit a bit y con el complemento de la máscara reduce ese número a ese múltiplo de la alineación.

Para máscaras de la forma 2^k - 1el cómputo

(x + mask) & ~mask

es lo mismo que

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

o

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

  • ¿Funcionará este truco para alignment que no son potencia de 2.

    – Aman Profundo Gautama

    29 de octubre de 2012 a las 14:07


  • No, solo funciona para potencias de 2. Pero especificar la alineación solo es útil para potencias de 2, por lo que no se manejan mal los casos útiles.

    –Daniel Fischer

    29 de octubre de 2012 a las 14:09

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad