Dirección física vs dirección virtual

1

La dirección física es la dirección de hardware de la memoria física y la dirección virtual es la que verá el procesador, tiene una etiqueta y un desplazamiento. Entiendo esto. ¿Puede alguien describirlo con un ejemplo, como la forma en que la MMU realiza esta operación (lo que agrega a la dirección física) y la asignación de memoria? ¿Y a qué se dirige físicamente etiquetado físicamente, virtualmente abordado virtualmente etiquetado?

    
pregunta deepu

3 respuestas

1

La traducción de direcciones se maneja a través de un búfer de traducción (TLB), que es solo un caché de información de traducción (y algunos metadatos como permisos, cacheabilidad, etc.). El TLB funciona sustituyendo el número de la página física (los bits de dirección por encima de los utilizados para indexar dentro de una página) por el número de página virtual proporcionado (es decir, la página virtual se asigna a la página física). (Dado que las páginas virtuales se alinean con las páginas físicas en la granularidad de la página, los bits de indexación dentro de una página coinciden con las direcciones virtuales y físicas de una página determinada).

Normalmente, para reducir la demora en la recuperación de datos, el caché se indexa con la dirección virtual en paralelo con la búsqueda de TLB; este sería un caché con direccionamiento virtual, pero si solo se usan los bits de índice dentro de una página, entonces también es un caché con direccionamiento físico (porque esos bits de la dirección virtual coinciden con los bits de la dirección física). (Una memoria caché se puede direccionar físicamente al menos parcialmente en paralelo con el acceso a TLB al predecir los bits extra no virtuales o al alimentar los bits adicionales después de indexar parcialmente la memoria caché, pero las compensaciones parecen favorecer las cachés con direcciones virtuales).

(El uso de bits de dirección no físicos en la indexación de la memoria caché puede introducir complejidades, ya que otra asignación de la página podría no utilizar los mismos bits de indexación virtuales).

Actualmente, se prefiere el etiquetado físico cuando se determina un acierto de caché comparando la etiqueta en el índice apropiado con la dirección física solicitada. La coherencia con otros dispositivos que acceden a la memoria (dispositivos de E / S o procesadores), que proporcionan direcciones físicas al sistema, es más fácil con las etiquetas físicas (evitando la necesidad de una dirección física para el mecanismo de traducción de direcciones virtuales, aunque también se pueden proporcionar etiquetas físicas a etiquetas virtuales mediante la duplicación del almacenamiento de etiquetas o mediante el uso de un caché L2 incluido).

Como ejemplo, con un 8KiB, un caché asociativo de conjuntos de dos vías con bloques de 16 bytes que utilizan páginas de 4KiB en un espacio de direcciones de 32 bits, habría 256 conjuntos (grupos de bloques de caché que comparten el mismo índice), que requieren 8 bits para indexar. Una carga de la palabra de 32 bits en 0x00ab_1134 indexaría los conjuntos con 8 bits (0x13), leería las dos etiquetas para ese conjunto y leería las palabras con desplazamiento 0x4 en ambos bloques de datos para el conjunto. (La lectura de ambos bloques reduce el retraso). Al indexar el caché, el número de página, los 20 bits principales de la dirección (0x00ab_1) se presentan a la TLB (generalmente con una ID de espacio de dirección adjunta); asumiendo que la información para esa página está disponible en el TLB (un resultado de TLB), la traducción se envía para compararse con ambas etiquetas, lo que resulta en una coincidencia con una de las etiquetas (en cuyo caso se seleccionan los datos correspondientes a esa etiqueta) o ninguna coincidencia (en cuyo caso hay una falta de caché). (La TLB también verificará si el proceso tiene permiso de lectura para esa página).

Con un caché virtualmente etiquetado, el TLB se puede sacar de la ruta crítica (lo que podría reducir el retraso del acceso al caché con un TLB más grande) ya que solo es necesario para las comprobaciones de permisos, no para la comparación de etiquetas. (La información del permiso incluso podría incluirse con las etiquetas de caché). Por lo general, un sistema tiene un espacio de direcciones virtuales más grande que el espacio de direcciones físico (almacenable en caché), por lo que las etiquetas de direcciones virtuales requerirían más espacio de almacenamiento; esta demanda de almacenamiento se incrementa mediante la adición de ID de espacio de direcciones para evitar tener que vaciar la memoria caché cuando se carga un proceso diferente (un sistema operativo de espacio de dirección único no necesitaría tal descarga).

El artículo de wikipedia para "CPU cache" podría ser útil.

    
respondido por el Paul A. Clayton
3

Es difícil decir lo que estás preguntando, y este no es el lugar para un libro sobre memoria virtual. Parece que estás preguntando cómo funciona la traducción de direcciones de direcciones virtuales a físicas. Intentaré explicarlo brevemente.

Esto se puede hacer de muchas maneras, con algunas compensaciones entre lo que el hardware maneja automáticamente y en qué nivel las cosas se vuelven demasiado complejas para que el software se involucre. Básicamente, para un bloque de direcciones virtuales que ya tiene sus datos en la memoria real (paginado), existe un mecanismo de traducción de hardware. Los bits de dirección baja se asignan directamente, por lo que solo es necesario traducir los bits superiores. Por ejemplo, si las páginas tienen un tamaño de 1 k, entonces los 10 bits bajos de cualquier virtual y la dirección física correspondiente son los mismos. Los bits superiores identifican la página, pero todavía puede haber muchos de ellos. Por ejemplo, en una máquina de direcciones de 32 bits con páginas de 1 k, hay 22 bits de dirección de página, o páginas de 4 M.

Podría hacer una tabla con entradas de 4 M, pero esto debe estar en una memoria rápida especial, ya que se usa en todas las referencias de direcciones. Eso sería muy costoso, por lo que generalmente se guarda una lista mucho más pequeña de páginas usadas recientemente en una memoria especial de alta velocidad. Esa memoria debe ser asociativa (contenido direccionado). Dicho de otra manera, cada referencia de página a todas las entradas en esta memoria de alta velocidad se verifica en paralelo para ver cuál de ellas contiene la información de mapeo para esa página en particular. El que proporciona los bits superiores de la dirección real, que luego se combina con los bits bajos para formar la dirección donde esa palabra reside actualmente en la memoria real. Esta memoria asociativa de alta velocidad especial a menudo se denomina translation lookaside buffer , o TLB.

Si ninguna de las entradas de TLB coincide con la dirección de la página, entonces las cosas se complican. No voy a entrar en todo eso porque hay mucho escrito al respecto. Si quieres saber más, haz preguntas específicas.

    
respondido por el Olin Lathrop
1

La mayoría de los conjuntos de instrucciones de los procesadores tienen un concepto de un espacio de direcciones unificado donde cada ubicación es direccionada por un solo "número" (a diferencia de un patrón de bits, lo que significa que 0x1000 se consideraría "más cercano" a 0x0FFF que a 0x0000 aunque difiere de los primeros en 13 bits, y de los últimos en solo un bit), o en una pequeña cantidad de dichos espacios (tal vez uno para E / S y otro para memoria, etc.). Si bien algunos sistemas tienen cada número diferente asignado de manera permanente a un circuito de memoria distinto, en la mayoría de los casos será posible acceder a una ubicación de memoria determinada a través de una variedad de números. En tales casos, la documentación de un sistema a menudo asignará a cada circuito de memoria un solo número "permanente" al que se hace referencia como su "dirección de hardware". Esto no se hace generalmente para circuitos de memoria individuales, por supuesto, sino para grupos de ellos.

Especialmente en sistemas más antiguos, la razón más común para que la memoria sea accesible en múltiples direcciones no se debió a ningún circuito complicado, sino a su falta. Un sistema usa números de 16 bits para representar las direcciones de memoria (64 K de espacio de direcciones), y no tiene nada en el bus de memoria. Hay un chip ROM de 8 K y un chip RAM de 2 K. Normalmente se usa el bit superior de la dirección para seleccionar entre la ROM. y chip de RAM, y use los 13 u 11 bits inferiores para seleccionar una dirección dentro del chip, y simplemente ignore el resto de los bits de dirección. El acceso a la dirección de memoria 0x1234 ( 0001 0010 0011 0100 ) causaría que el sistema seleccione el chip ROM (ya que el bit alto está claro), y envía los 13 bits inferiores de la dirección al chip, accediendo a la ubicación 0x1234 ( 1 0010 0011 0100 ) . La ubicación de la memoria de lectura 0x5234 ( 0101 0010 0011 0100 ) también haría que el sistema seleccione el chip ROM y envíe los 13 bits inferiores de la dirección al chip (nuevamente, 1 0010 0011 0100 ). Por lo tanto, 0x5234 y 0x1234 se asignarían a la misma dirección (que normalmente se designaría como dirección de hardware 0x1234).

En el sistema descrito anteriormente, la asignación entre las direcciones lógicas (los números vistos por el procesador) y las direcciones físicas (que identifican los circuitos de memoria) fue fija. En los sistemas más nuevos, existen varios medios por los cuales se pueden cambiar las asignaciones. Un patrón común (aún utilizado en algunos microcontroladores, aunque no en procesadores de escritorio) es tener circuitos que detecten uno o más rangos discretos de espacio de direcciones y alimenten el contenido de ciertos registros de control en partes del bus de direcciones cuando se activan. Este enfoque hace posible tener una memoria de acceso al procesador que es mucho más grande que su espacio de direcciones normal. Por ejemplo, un procesador con una dirección de 16 bits (64K de espacio de direcciones) podría conectarse a un megabyte de RAM de tal manera que una dirección de la forma 11xx xxxx xxxx xxxx ) se asignará a la dirección de hardware 1111 11xx xxxx xxxx xxxx , mientras que una dirección de la forma 10xx xxxx xxxx xxxx se asignará a la dirección de hardware rrrr rrxx xxxx xxxx , donde rr rrrr representa el contenido de un registro especial de 6 bits). Para facilitar el movimiento de datos entre diferentes partes de la memoria, muchos de estos sistemas tendrán dos o rangos de direcciones cuya dirección de hardware se puede configurar de forma independiente. Por ejemplo, el sistema mencionado anteriormente también podría incluir hardware para que el acceso a 01xx xxxx xxxx xxxx funcione en la dirección de hardware ssss ssxx xxxx xxxx xxxx , donde ss ssss es un registro de seis bits que puede escribirse independientemente de rr rrrr .

Muchas máquinas de escritorio llevan el concepto anterior un paso más allá. En lugar de simplemente proporcionar un pequeño número de rangos de direcciones que se pueden usar para acceder a muchas piezas diferentes de memoria, permiten que cada rango de espacio de direcciones 4K se asigne de forma independiente a cualquier espacio de memoria física de 4K. Tales habilidades son muy poderosas, pero son mucho más complicadas de lo que vale la pena discutir aquí.

    
respondido por el supercat

Lea otras preguntas en las etiquetas