2011-11-19 14 views
5

Creo que entiendo la alineación de la memoria, pero lo que me confunde es que la dirección de un puntero en algunos sistemas va a estar en la memoria virtual, ¿verdad? Así que la mayoría de las comprobaciones/garantías de alineación que he visto parecen simplemente usar la dirección del puntero. ¿No es posible que la dirección de la memoria física no esté alineada? ¿No es problemático para cosas como SSE?Memoria virtual y alineación: ¿cómo se factorizan juntas?

+1

No soy experto en el modelo de memoria de bajo nivel (incluida la alineación). Pero creo que las páginas estarían alineadas, lo que supondría que haría que cualquier puntero relativo dentro de esas páginas se alinee automáticamente. –

+0

Sí, parece que lo que no entendí fue memoria virtual. –

Respuesta

8

La dirección física se alineará porque la memoria virtual solo asigna las páginas alineadas a la memoria física (y las páginas suelen ser de 4 KB).

Así que a menos que necesite alineación> tamaño de página, la memoria física se alineará según sus requisitos.

En el caso específico de SSE, todo funciona bien porque solo necesita una alineación de 16 bytes.

4

No conozco ningún sistema real en el que una dirección de memoria virtual alineada pueda dar como resultado una dirección de memoria física mal alineada.

Por lo general, todas las alineaciones en una plataforma determinada serán potencias de dos. Por ejemplo, en x86, los enteros de 32 bits tienen una alineación natural de 4 bytes (2^2). El tamaño de página, que define qué tan bien puede mapear un bloque en la memoria física, generalmente es una potencia de grande de dos. En x86, el tamaño de página más pequeño permitido es 4096 bytes (2^12). El tipo de datos más grande que podría necesitar alineamiento en x86 es 128 bits (para registros XMM y CMPXCHG16B) 32 bytes (para AVX) - 2^5. Como 2^12 es divisible por 2^5, encontrará que todo se alinea al principio de una página, y como las páginas están alineadas tanto en la memoria virtual como en la física, una dirección alineada virtual siempre estará alineada físicamente.

En un nivel más práctico, lo que permite alinear las direcciones virtuales para asignar a las direcciones físicas no alineados no sólo haría muy difícil generar el código, sino que también haría que la arquitectura de la CPU más complejo que simplemente permitiendo que cualquier alineación (ya que ahora tenemos páginas de tamaño impar y otras rarezas ...)

Tenga en cuenta que puede tener razones para solicitar alineaciones más grandes que una página de vez en cuando. Por lo general, para la codificación de espacio de usuario, no importa si está alineado en la RAM física (para el caso, si está solicitando varias páginas, ¡es poco probable que sea contigua!). Los problemas aquí solo surgen si está escribiendo un controlador de dispositivo y necesita un bloque grande, alineado y contiguo para DMA. Pero incluso entonces, por lo general, el dispositivo no es estricto con respecto a la alineación de tamaño mayor que la página.

+0

En realidad, el tipo de datos más grande que podría necesitar alineamiento en x86 es actualmente de 32 bytes, para AVX. También hay otros casos en los que puede solicitar la alineación> 32 bytes: no es raro solicitar que las asignaciones dinámicas estén alineadas con la página. –