Dirección física vs dirección virtual

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 una compensación. Entiendo esto. ¿Alguien puede describirlo con un ejemplo, como cómo la MMU realiza esta operación (lo que agrega a la dirección física) y qué es el mapeo de memoria? ¿Y lo que es físicamente direccionado físicamente etiquetado, virtualmente direccionado virtualmente etiquetado?

Consulte "tabla de páginas" y "búfer de búsqueda de traducción".
Esta es realmente una pregunta de arquitectura de computadora, no una pregunta de EE. ¿No hay un sitio SE diferente para eso?
@DaveTweed ... ¿desde cuándo la arquitectura de la computadora no está relacionada con EE? #ofendido #CEPE

Respuestas (3)

La traducción de direcciones se maneja a través de un búfer de búsqueda de traducción (TLB), que es solo un caché de información de traducción (y algunos metadatos como permisos, capacidad de almacenamiento en caché, etc.). La TLB funciona sustituyendo el número de 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 están alineadas con las páginas físicas en la granularidad de la página, los bits que se indexan dentro de una página coinciden con las direcciones virtuales y físicas de una página determinada).

Por lo general, para reducir la demora en la recuperación de datos, la memoria caché se indexa con la dirección virtual en paralelo con la búsqueda de TLB; esto sería un caché con dirección virtual, pero si solo se usan bits de índice dentro de una página, entonces también es un caché con dirección física (porque esos bits de la dirección virtual coinciden con los bits de la dirección física). (Un caché puede ser direccionado físicamente al menos parcialmente en paralelo con el acceso TLB prediciendo los bits no virtuales adicionales o alimentando los bits adicionales después de indexar parcialmente el caché, pero las ventajas y desventajas parecen favorecer los cachés direccionados virtualmente).

(El uso de bits de direcciones no físicas en la indexación de la memoria caché puede presentar complejidades, ya que es posible que otra asignación de la página no use los mismos bits de indexación virtual).

Actualmente, se prefiere el etiquetado físico donde 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 etiquetas físicas (evitando la necesidad de un mecanismo de traducción de dirección física a dirección virtual, aunque se pueden proporcionar etiquetas físicas además a etiquetas virtuales mediante la duplicación del almacenamiento de etiquetas o mediante el uso de una caché L2 inclusiva).

Como ejemplo, con una caché asociativa de conjunto bidireccional de 8 KiB con bloques de 16 bytes que utilizan páginas de 4 KiB en un espacio de direcciones de 32 bits, habría 256 conjuntos (grupos de bloques de caché que comparten el mismo índice), lo que requiere 8 bits para índice. 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 en el desplazamiento 0x4 en ambos bloques de datos para el conjunto. (La lectura de ambos bloques reduce la demora). Mientras se indexa el caché, el número de página, los 20 bits superiores de la dirección (0x00ab_1) se presentan a la TLB (generalmente con un ID de espacio de direcciones adjunto); suponiendo que la información de esa página esté disponible en la TLB (un hit de la TLB), la traducción se envía para compararla con ambas etiquetas, lo que da como resultado 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 una caché etiquetada virtualmente, la TLB se puede sacar de la ruta crítica (lo que podría reducir el retraso en el acceso a la caché con una TLB más grande), ya que solo se necesita para las verificaciones de permisos, no para la comparación de etiquetas. (La información de permisos podría incluso 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ísicas (almacenable en caché), por lo que las etiquetas de direcciones virtuales requerirían más espacio de almacenamiento; esta demanda de almacenamiento aumenta con la adición de ID de espacio de direcciones para evitar tener que vaciar la memoria caché cuando se carga un proceso diferente (un SO de espacio de direcciones único no necesitaría tal vaciado).

El artículo de wikipedia sobre "caché de CPU" podría ser útil.

Es difícil decir lo que está preguntando, y este no es el lugar para un libro sobre memoria virtual. Parece que está 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 algunos compromisos entre lo que maneja automáticamente el hardware y en qué nivel las cosas se vuelven demasiado complejas para que el software tenga que involucrarse. Básicamente, para un bloque de direcciones virtuales que ya tiene sus datos en memoria real (paginados), existe un mecanismo de traducción de hardware. Los bits de dirección inferiores 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 dirección virtual y 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 de tamaño, hay 22 bits de dirección de página o 4 M de páginas.

Podría hacer una tabla con 4 M de entradas, pero esto debe estar en una memoria rápida especial, ya que se usa cada referencia de dirección. 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 abordado). Dicho de otra manera, cada referencia de página, todas las entradas en esta memoria de alta velocidad se verifican en paralelo para ver cuál, si hay alguna, 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 inferiores para formar la dirección donde esa palabra reside actualmente en la memoria real. Esta memoria asociativa especial de alta velocidad a menudo se denomina búfer de búsqueda de traducción o TLB.

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

La mayoría de los conjuntos de instrucciones de los procesadores tienen el concepto de un espacio de direcciones unificado en el que cada ubicación se direcciona con 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 del primero en 13 bits y del último en solo un bit), o un pequeño número de tales espacios (quizás uno para E/S y otro para memoria, etc.). Si bien algunos sistemas tienen cada número diferente asignado permanentemente 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 único número "permanente" al que se hace referencia como su "dirección de hardware". Esto es n'

Especialmente en los sistemas más antiguos, la razón más común por la que se podía acceder a la memoria en varias direcciones no se debía a ningún circuito complicado, sino a la falta de él. Un sistema usa números de 16 bits para representar direcciones de memoria (64K de espacio de direcciones), y no tiene nada en el bus de memoria, son un chip de ROM de 8K y un chip de RAM de 2K, normalmente usaría el bit superior de la dirección para seleccionar entre la ROM y el chip 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. Acceder a la dirección de memoria 0x1234 ( 0001 0010 0011 0100) haría que el sistema seleccionara el chip ROM (dado que el bit alto está claro) y enviaría los 13 bits inferiores de la dirección al chip, accediendo a la ubicación 0x1234 ( ) 1 0010 0011 0100del mismo. Ubicación de la memoria de lectura 0x5234 (0101 0010 0011 0100) también haría que el sistema seleccionara el chip ROM y enviara 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, se arregló el mapeo entre las direcciones lógicas (los números vistos por el procesador) y las direcciones físicas (que identifican los circuitos de memoria). En los sistemas más nuevos, existen varios medios por los cuales se pueden cambiar las asignaciones. Un patrón común (que todavía se usa en algunos microcontroladores, aunque no en los procesadores de escritorio) es tener un circuito que detecte uno o más rangos discretos de espacio de direcciones y envíe el contenido de ciertos registros de control a partes del bus de direcciones cuando se activen. 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 (espacio de direcciones de 64K) podría conectarse a un megabyte de RAM de tal manera que una dirección del tipo ) se 11xx xxxx xxxx xxxxasignará a la dirección del hardware.1111 11xx xxxx xxxx xxxx, mientras que una dirección del formulario 10xx xxxx xxxx xxxxse asignará a la dirección de hardware rrrr rrxx xxxx xxxx, donde rr rrrrrepresenta 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 antes mencionado también podría incluir hardware para que un acceso a 01xx xxxx xxxx xxxxopere en la dirección de hardware ssss ssxx xxxx xxxx xxxx, donde ss sssshay 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 una pequeña cantidad de rangos de direcciones que se pueden usar para acceder a muchas piezas diferentes de memoria, permiten que cada rango de 4K de espacio de direcciones se asigne independientemente a cualquier 4K de espacio de memoria física. Tales habilidades son muy poderosas, pero son mucho más complicadas de lo que vale la pena discutir aquí.