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?
Respuesta
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.
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.
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. –
- 1. Alineación InterlockedExchange y memoria
- 2. Memoria virtual y sbrk
- 3. ¿Memoria virtual?
- 4. Memoria virtual
- 5. C++ pregunta alineación de memoria
- 6. operador nueva sobrecarga y alineación
- 7. ¿Cómo se suman varias consultas SQL juntas?
- 8. Alineación de asignación de memoria Java
- 9. ¿Admite Android la memoria virtual
- 10. ¿La memoria virtual es infinita?
- 11. alineación de memoria de gcc pragma
- 12. ¿Valarray tiene alineación de memoria contigua?
- 13. Recolector de elementos no utilizados .NET y memoria virtual x64
- 14. Alineación de CPU y datos
- 15. ¿Cómo entiende malloc la alineación?
- 16. SSE, intrínsecos y alineación
- 17. uso práctico de la memoria virtual
- 18. ¿Cómo se factorizan las llamadas comunes "antes (: cada)" en RSpec para que múltiples especificaciones puedan usarlas?
- 19. ¿Realloc mantiene la alineación de memoria de posix_memalign?
- 20. ¿Cómo puedo usar las pruebas maven y jUnit juntas?
- 21. ¿Cómo limitar el uso de memoria virtual por node.js?
- 22. Comprensión de dirección virtual y espacio de dirección virtual
- 23. Alineación de memoria en un procesador Intel de 32 bits
- 24. Encadenando plantillas variadas juntas
- 25. Doble alineación
- 26. Concat dos cadenas juntas
- 27. Asignación de pila, relleno y alineación
- 28. Alineación de memoria predeterminada de MSVC de 8
- 29. Alineación de la estructura C en la memoria FLASH interna
- 30. alineación y granularidad de mmap
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. –
Sí, parece que lo que no entendí fue memoria virtual. –