left - Dirección de memoria alineada naturalmente
left shift c (4)
La alineación natural requiere que cada acceso de N bytes debe alinearse en un límite de dirección de memoria de N. Podemos expresar esto en términos del operador de módulo: addr% N debe ser cero. por ejemplo:
El acceso a 4 bytes de memoria desde la dirección 0x10004 está alineado (0x10004% 4 = 0).
El acceso a 4 bytes de memoria desde la dirección 0x10005 no está alineado (0x10005% 4 = 1).
Necesito extraer una dirección de memoria dentro de un valor de 64 bits existente, y esta dirección apunta a una matriz de 4K, el valor inicial es:
0x000000030c486000
La dirección que necesito se almacena dentro de los bits 51:12, así que extraigo esos bits usando:
address = start >> 12 & 0x0000007FFFFFFFFF
Esto me deja con la dirección de:
0x000000000030c486
Sin embargo, la documentación que estoy leyendo indica que la matriz almacenada en la dirección tiene un tamaño de 4 KB y está naturalmente alineada.
Estoy un poco confundido sobre lo que significa alineado naturalmente. Sé que con las cosas alineadas con la página, la dirección normalmente termina con ''000'' (aunque podría estar equivocado al respecto).
Asumo que como la dirección tomada desde el valor de inicio tiene solo 40 bits de longitud, necesito realizar una operación de cambio de bits adicional para organizar los bits y poder interpretarlos correctamente más adelante.
Si alguien pudiera ofrecerme algún consejo para hacer esto, lo agradecería.
Gracias
Normalmente, "naturalmente alineado" significa que cualquier elemento está alineado con al menos un múltiplo de su propio tamaño. Por ejemplo, un objeto de 4 bytes está alineado con una dirección que es un múltiplo de 4, un objeto de 8 bytes está alineado con una dirección que es un múltiplo de 8, etc.
Para una matriz, normalmente no se ve el tamaño de toda la matriz, sino el tamaño de un elemento de la matriz.
Del mismo modo, para una struct
o union
, normalmente miras el tamaño del elemento más grande.
Una dirección "naturalmente alineada" es aquella que es un múltiplo de algún valor que se prefiere para el tipo de datos en el procesador. Para la mayoría de los tipos de datos elementales en los procesadores más comunes, la alineación preferida es la misma que el tamaño de los datos: los enteros de cuatro bytes deben alinearse en múltiplos de cuatro bytes, el punto flotante de ocho bytes debe alinearse en múltiplos de ocho bytes , y así. Algunas plataformas requieren alineamiento, otras simplemente lo prefieren. Algunos tipos tienen requisitos de alineación diferentes de sus tamaños. Por ejemplo, un long float
10 bytes de long float
puede requerir una alineación de cuatro bytes. Los valores específicos dependen de su plataforma objetivo. "Naturalmente alineado" no es un término formal, por lo que algunas personas pueden definirlo solo como una alineación preferida que es un múltiplo del tamaño de los datos, mientras que otros pueden permitir que se use para otras alineaciones preferidas en el procesador.
Sacar bits de un valor de 64 bits sugiere que la dirección se ha transformado de alguna manera. Por ejemplo, los bits clave de la dirección se han almacenado en una entrada de tabla de página. Reconstruir la dirección original puede ser o no tan simple como extraer los bits y desplazarlos hasta el "derecho" (extremo bajo). Sin embargo, también es común que bits como este se desplacen a una posición diferente (con ceros a la izquierda en los bits bajos). Debe verificar la documentación cuidadosamente.
Tenga en cuenta que una matriz de 4 KiB, 4096 bytes, corresponde a 2 12 bytes. La coincidencia de 12 con el campo 51:12 en el valor de 64 bits sugiere que la dirección se puede obtener simplemente extrayendo esos 40 bits sin cambiarlos en absoluto.
Desde una perspectiva de hardware, la memoria normalmente se divide en fragmentos de algún tamaño, de modo que cualquiera o todos los datos dentro de un fragmento se pueden leer o escribir en una sola operación, pero cualquier operación solo puede afectar los datos dentro de un solo fragmento.
Un sistema típico de la era 80386 tendría memoria agrupada en trozos de cuatro bytes. El acceso a un valor de dos bytes o de cuatro bytes que se ajuste por completo a un único fragmento requerirá una operación. Si el valor se almacenó parcialmente en un trozo y parcialmente en otro, se necesitarían dos operaciones.
A lo largo de los años, los tamaños de fragmentos han aumentado de tamaño con respecto al tamaño de los datos, hasta el punto de que la mayoría de los valores de 32 bits colocados aleatoriamente cabrían completamente en un fragmento, pero puede surgir un segundo problema con algunos procesadores: si un fragmento es, por ejemplo, 512 bits ( 64 bytes) y se sabe que una palabra de 32 bits está alineada en un múltiplo de cuatro bytes (32 bits), la obtención de cada bit de la palabra puede provenir de cualquiera de los 16 lugares. Si no se sabe que la palabra está alineada, cada bit podría provenir de cualquiera de los 61 lugares para los casos en que la palabra se ajuste por completo dentro del fragmento. La circuitería para seleccionar rápidamente entre 61 opciones es más compleja que la circuitería para seleccionar entre 16, y la mayoría de los códigos usarán datos alineados, por lo que incluso en casos donde una palabra no alineada podría caber en un solo fragmento accesible, el hardware podría necesitar un poco más tiempo para extraerlo