Un búfer de traducción de direcciones ( TLB ) es un caché de memoria que almacena las traducciones recientes de la memoria virtual a la memoria física . Se utiliza para reducir el tiempo que se tarda en acceder a una ubicación de la memoria del usuario. [1] Se puede llamar caché de traducción de direcciones. Es una parte de la unidad de gestión de memoria (MMU) del chip. Un TLB puede residir entre la CPU y el caché de la CPU , entre el caché de la CPU y la memoria principal o entre los diferentes niveles del caché multinivel. La mayoría de los procesadores de escritorio, portátiles y servidores incluyen uno o más TLB en el hardware de gestión de memoria, y casi siempre está presente en cualquier procesador que utilice memoria virtual paginada o segmentada .
La TLB a veces se implementa como memoria direccionable por contenido (CAM). La clave de búsqueda CAM es la dirección virtual y el resultado de la búsqueda es una dirección física . Si la dirección solicitada está presente en la TLB, la búsqueda CAM produce una coincidencia rápidamente y la dirección física recuperada se puede utilizar para acceder a la memoria. Esto se llama un acierto de TLB. Si la dirección solicitada no está en la TLB, es un error y la traducción continúa buscando en la tabla de páginas en un proceso llamado recorrido de página . El recorrido de página consume mucho tiempo en comparación con la velocidad del procesador, ya que implica leer el contenido de múltiples ubicaciones de memoria y usarlos para calcular la dirección física. Después de que la dirección física se determina mediante el recorrido de página, la asignación de dirección virtual a dirección física se ingresa en la TLB. El PowerPC 604 , por ejemplo, tiene una TLB asociativa de conjuntos bidireccional para cargas y almacenamientos de datos. [2] Algunos procesadores tienen diferentes TLB de instrucciones y direcciones de datos.
Una TLB tiene un número fijo de ranuras que contienen entradas de tabla de páginas y entradas de tabla de segmentos; las entradas de tabla de páginas asignan direcciones virtuales a direcciones físicas y direcciones de tabla intermedia, mientras que las entradas de tabla de segmentos asignan direcciones virtuales a direcciones de segmento, direcciones de tabla intermedia y direcciones de tabla de páginas. La memoria virtual es el espacio de memoria visto desde un proceso; este espacio a menudo se divide en páginas de un tamaño fijo (en memoria paginada), o con menos frecuencia en segmentos de tamaños variables (en memoria segmentada). La tabla de páginas, generalmente almacenada en la memoria principal , realiza un seguimiento de dónde se almacenan las páginas virtuales en la memoria física. Este método utiliza dos accesos de memoria (uno para la entrada de tabla de páginas, uno para el byte) para acceder a un byte. Primero, se busca el número de marco en la tabla de páginas. Segundo, el número de marco con el desplazamiento de página proporciona la dirección real. Por lo tanto, cualquier esquema de memoria virtual sencillo tendría el efecto de duplicar el tiempo de acceso a la memoria. Por lo tanto, la TLB se utiliza para reducir el tiempo necesario para acceder a las ubicaciones de memoria en el método de tabla de páginas. La TLB es un caché de la tabla de páginas, que representa solo un subconjunto del contenido de la tabla de páginas.
En cuanto a las direcciones de memoria física, una TLB puede residir entre la CPU y la caché de la CPU , entre la caché de la CPU y la memoria de almacenamiento principal , o entre los niveles de una caché de varios niveles. La ubicación determina si la caché utiliza direccionamiento físico o virtual. Si la caché tiene direccionamiento virtual, las solicitudes se envían directamente desde la CPU a la caché y solo se accede a la TLB en caso de un error de caché . Si la caché tiene direccionamiento físico, la CPU realiza una búsqueda de TLB en cada operación de memoria y la dirección física resultante se envía a la caché.
En una arquitectura Harvard o una arquitectura Harvard modificada , puede existir un espacio de dirección virtual independiente o un hardware de acceso a la memoria para instrucciones y datos. Esto puede dar lugar a distintas TLB para cada tipo de acceso, un búfer de traducción de instrucciones (ITLB) y un búfer de traducción de datos (DTLB). Se han demostrado varios beneficios con TLB de datos e instrucciones independientes. [4]
La TLB se puede utilizar como caché de hardware de búsqueda rápida. La figura muestra el funcionamiento de una TLB. Cada entrada de la TLB consta de dos partes: una etiqueta y un valor. Si la etiqueta de la dirección virtual entrante coincide con la etiqueta de la TLB, se devuelve el valor correspondiente. Dado que la búsqueda de la TLB suele ser parte de la secuencia de instrucciones, las búsquedas son rápidas y no afectan esencialmente al rendimiento. Sin embargo, para poder buscar dentro de la secuencia de instrucciones, la TLB debe ser pequeña.
Una optimización común para cachés con direcciones físicas es realizar la búsqueda de TLB en paralelo con el acceso a la caché. En cada referencia de memoria virtual, el hardware verifica la TLB para ver si el número de página se encuentra allí. Si es así, se trata de un acierto de TLB y se realiza la traducción. Se devuelve el número de marco y se utiliza para acceder a la memoria. Si el número de página no está en la TLB, se debe verificar la tabla de páginas. Según la CPU, esto se puede hacer automáticamente utilizando un hardware o utilizando una interrupción en el sistema operativo. Cuando se obtiene el número de marco, se puede utilizar para acceder a la memoria. Además, agregamos el número de página y el número de marco a la TLB, de modo que se encuentren rápidamente en la siguiente referencia. Si la TLB ya está llena, se debe seleccionar un bloque adecuado para reemplazarlo. Existen diferentes métodos de reemplazo, como el menos usado recientemente (LRU), el primero en entrar, el primero en salir (FIFO), etc.; consulte la sección de traducción de direcciones en el artículo sobre caché para obtener más detalles sobre el direccionamiento virtual en lo que respecta a cachés y TLB.
La CPU tiene que acceder a la memoria principal en caso de un error de caché de instrucciones, de caché de datos o de TLB. El tercer caso (el más simple) es cuando la información deseada está en realidad en una caché, pero la información para la traducción virtual a física no está en una TLB. Todos estos casos son lentos, debido a la necesidad de acceder a un nivel más lento de la jerarquía de memoria, por lo que es importante que una TLB funcione bien. De hecho, un error de TLB puede ser más costoso que un error de caché de instrucciones o de datos, debido a la necesidad no solo de una carga desde la memoria principal, sino de un recorrido de página, lo que requiere varios accesos a la memoria.
El diagrama de flujo proporcionado explica el funcionamiento de una TLB. Si se trata de un error de TLB, la CPU comprueba la tabla de páginas en busca de la entrada de la tabla de páginas. Si el bit actual está establecido, la página está en la memoria principal y el procesador puede recuperar el número de trama de la entrada de la tabla de páginas para formar la dirección física. [6] El procesador también actualiza la TLB para incluir la nueva entrada de la tabla de páginas. Finalmente, si el bit actual no está establecido, la página deseada no está en la memoria principal y se emite un error de página . A continuación, se llama a una interrupción de error de página, que ejecuta la rutina de manejo de error de página.
Si el conjunto de trabajo de la página no cabe en la TLB, se produce un bloqueo de la TLB , en el que se producen frecuentes errores de TLB y cada página recién almacenada en caché desplaza a otra que se volverá a utilizar pronto, lo que degrada el rendimiento exactamente de la misma manera que lo hace el bloqueo de la caché de instrucciones o datos. El bloqueo de la TLB puede producirse incluso si no se produce el bloqueo de la caché de instrucciones o de datos , porque se almacenan en caché en unidades de tamaño diferente. Las instrucciones y los datos se almacenan en caché en bloques pequeños ( líneas de caché ), no en páginas enteras, pero la búsqueda de direcciones se realiza a nivel de página. Por lo tanto, incluso si los conjuntos de trabajo de código y datos caben en la caché, si los conjuntos de trabajo están fragmentados en muchas páginas, el conjunto de trabajo de direcciones virtuales puede no caber en la TLB, lo que provoca el bloqueo de la TLB. Por lo tanto, el tamaño adecuado de la TLB requiere considerar no solo el tamaño de las cachés de instrucciones y datos correspondientes, sino también cómo se fragmentan en varias páginas.
De manera similar a las cachés, las TLB pueden tener múltiples niveles. Las CPU pueden estar (y hoy en día generalmente lo están) construidas con múltiples TLB, por ejemplo, una TLB L1 pequeña (potencialmente totalmente asociativa) que es extremadamente rápida, y una TLB L2 más grande que es algo más lenta. Cuando se utilizan TLB de instrucciones (ITLB) y TLB de datos (DTLB), una CPU puede tener tres (ITLB1, DTLB1, TLB2) o cuatro TLB.
Por ejemplo, la microarquitectura Nehalem de Intel tiene un DTLB L1 asociativo de cuatro vías con 64 entradas para páginas de 4 KiB y 32 entradas para páginas de 2/4 MiB, un ITLB L1 con 128 entradas para páginas de 4 KiB usando asociatividad de cuatro vías y 14 entradas completamente asociativas para páginas de 2/4 MiB (ambas partes del ITLB divididas estáticamente entre dos subprocesos) [7] y un TLB L2 unificado de 512 entradas para páginas de 4 KiB, [8] ambos asociativos de 4 vías. [9]
Algunas TLB pueden tener secciones separadas para páginas pequeñas y páginas grandes. Por ejemplo, la microarquitectura Intel Skylake separa las entradas de TLB para páginas de 1 GiB de aquellas para páginas de 4 KiB/2 MiB. [10]
En las arquitecturas modernas se encuentran tres esquemas para manejar errores de TLB:
La arquitectura MIPS especifica una TLB administrada por software. [12]
La arquitectura SPARC V9 permite que una implementación de SPARC V9 no tenga MMU, tenga una MMU con una TLB administrada por software o una MMU con una TLB administrada por hardware, [13] y la Arquitectura UltraSPARC 2005 especifica una TLB administrada por software. [14]
La arquitectura de Itanium ofrece la opción de utilizar TLB gestionados por software o hardware. [15]
La arquitectura Alpha tiene una TLB administrada por firmware, y el código de manejo de errores de la TLB se encuentra en PALcode , en lugar de en el sistema operativo. Como el PALcode de un procesador puede ser específico del procesador y del sistema operativo, esto permite que diferentes versiones de PALcode implementen diferentes formatos de tabla de páginas para diferentes sistemas operativos, sin necesidad de que el formato de la TLB y las instrucciones para controlar la TLB sean especificados por la arquitectura. [16]
Estos son los niveles de rendimiento típicos de un TLB: [17]
La tasa de ciclo de memoria efectiva promedio se define como ciclos, donde es el número de ciclos necesarios para una lectura de memoria, es la tasa de errores y es el tiempo de acceso en ciclos. Si un acceso a TLB toma 1 ciclo de reloj, un error toma 30 ciclos de reloj, una lectura de memoria toma 30 ciclos de reloj y la tasa de errores es del 1%, la tasa de ciclo de memoria efectiva es un promedio de (31,29 ciclos de reloj por acceso a memoria). [18]
En un cambio de espacio de direcciones, como ocurre cuando se cambia de contexto entre procesos (pero no entre subprocesos), algunas entradas de la TLB pueden volverse inválidas, ya que la asignación de virtual a físico es diferente. La estrategia más simple para lidiar con esto es vaciar completamente la TLB. Esto significa que después de un cambio, la TLB está vacía y cualquier referencia de memoria será un error, por lo que pasará algún tiempo antes de que las cosas vuelvan a funcionar a toda velocidad. Las CPU más nuevas utilizan estrategias más efectivas para marcar a qué proceso corresponde una entrada. Esto significa que si un segundo proceso se ejecuta solo por un corto tiempo y salta de nuevo a un primer proceso, la TLB puede tener aún entradas válidas, ahorrando el tiempo para volver a cargarlas. [19]
Otras estrategias evitan vaciar la TLB en un cambio de contexto: (a) Un sistema operativo con un solo espacio de direcciones utiliza la misma asignación de virtual a físico para todos los procesos. (b) Algunas CPU tienen un registro de identificación de proceso y el hardware utiliza entradas de TLB solo si coinciden con la identificación del proceso actual.
Por ejemplo, en el Alpha 21264 , cada entrada de TLB está etiquetada con un número de espacio de dirección (ASN), y solo las entradas de TLB con un ASN que coincida con la tarea actual se consideran válidas. Otro ejemplo en el Intel Pentium Pro , la bandera de habilitación global de página (PGE) en el registro CR4 y la bandera global (G) de una entrada de directorio de páginas o tabla de páginas se pueden usar para evitar que las páginas utilizadas con frecuencia se invaliden automáticamente en las TLB en un cambio de tarea o una carga de registro CR3. Desde la microarquitectura Westmere 2010, los procesadores Intel 64 también admiten identificadores de contexto de proceso (PCID) de 12 bits , que permiten retener entradas de TLB para múltiples espacios de direcciones lineales, y solo se usan para la traducción de direcciones aquellas que coinciden con el PCID actual. [20] [21]
Si bien el vaciado selectivo de la TLB es una opción en las TLB administradas por software, la única opción en algunas TLB de hardware (por ejemplo, la TLB en Intel 80386 ) es el vaciado completo de la TLB en un conmutador de espacio de direcciones. Otras TLB de hardware (por ejemplo, la TLB en Intel 80486 y procesadores x86 posteriores, y la TLB en procesadores ARM ) permiten el vaciado de entradas individuales de la TLB indexadas por dirección virtual.
El vaciado de la TLB puede ser un mecanismo de seguridad importante para el aislamiento de la memoria entre procesos, con el fin de garantizar que un proceso no pueda acceder a los datos almacenados en las páginas de memoria de otro proceso. El aislamiento de la memoria es especialmente crítico durante las conmutaciones entre el proceso del núcleo del sistema operativo privilegiado y los procesos del usuario, como se puso de relieve en la vulnerabilidad de seguridad Meltdown . Las estrategias de mitigación, como el aislamiento de la tabla de páginas del núcleo (KPTI), dependen en gran medida de vaciados de la TLB que afectan al rendimiento y se benefician en gran medida de la gestión selectiva de entradas de la TLB habilitada por hardware, como PCID. [22]
Con la llegada de la virtualización para la consolidación de servidores, se han hecho muchos esfuerzos para hacer que la arquitectura x86 sea más fácil de virtualizar y garantizar un mejor rendimiento de las máquinas virtuales en hardware x86. [23] [24]
Normalmente, las entradas en las TLB x86 no están asociadas con un espacio de direcciones en particular; implícitamente hacen referencia al espacio de direcciones actual. Por lo tanto, cada vez que hay un cambio en el espacio de direcciones, como un cambio de contexto, se debe vaciar toda la TLB. Mantener una etiqueta que asocie cada entrada de la TLB con un espacio de direcciones en el software y comparar esta etiqueta durante la búsqueda de la TLB y el vaciado de la TLB es muy costoso, especialmente porque la TLB x86 está diseñada para operar con una latencia muy baja y completamente en hardware. En 2008, tanto Intel ( Nehalem ) [25] como AMD ( SVM ) [26] han introducido etiquetas como parte de la entrada de la TLB y hardware dedicado que verifica la etiqueta durante la búsqueda. No todos los sistemas operativos hicieron un uso completo de estas etiquetas de inmediato, pero Linux 4.14 comenzó a usarlas para identificar espacios de direcciones utilizados recientemente, ya que los PCID de 12 bits (4095 valores diferentes) son insuficientes para todas las tareas que se ejecutan en una CPU determinada. [27]
{{cite book}}
: CS1 maint: varios nombres: lista de autores ( enlace )Si no se encuentra ninguna entrada TLB coincidente, se produce una excepción de error de TLB.
{{cite book}}
: Mantenimiento de CS1: ubicación ( enlace )