Una tabla de páginas es una estructura de datos utilizada por el sistema de memoria virtual en el sistema operativo de una computadora para almacenar el mapeo entre una dirección virtual y una dirección física . Las direcciones virtuales son utilizadas por el proceso en ejecución , mientras que las direcciones físicas son utilizadas por el hardware , o más específicamente, el subsistema RAM . La tabla de páginas es un componente clave de la traducción de direcciones virtuales , que se requiere para acceder a los datos en la memoria.
En los sistemas operativos que usan memoria virtual, se crea la ilusión de que cualquier proceso tiene acceso a la memoria lineal del mismo tamaño que el espacio de direcciones del proceso [1] . Físicamente, la memoria de cada proceso se divide en páginas (en un sistema con paginación ) o segmentos (en un sistema con memoria virtual segmentada), que pueden estar dispersas en diferentes áreas de la memoria física o pueden trasladarse a otro almacenamiento, generalmente a un disco duro o unidad de estado sólido .
Los procesadores modernos usan los conceptos de memoria física y memoria virtual : los procesos en ejecución usan direcciones virtuales y cuando una instrucción solicita acceso a la memoria, el procesador traduce la dirección virtual a una dirección física usando el búfer de traducción asociativo (TLB) y/o la tabla de páginas.
Cuando un proceso accede a los datos en la memoria, el sistema operativo debe asignar la dirección virtual utilizada por el proceso a la dirección de la memoria física donde se almacenan los datos. En la tabla de páginas de un proceso, el sistema operativo almacena una asignación de direcciones virtuales a direcciones físicas. Cada entrada de la tabla también se denomina "entrada de la tabla de páginas" (PTE) [2] .
La Unidad de administración de memoria (MMU) de la CPU mantiene un caché de asignaciones utilizadas recientemente de la tabla de páginas del sistema operativo. Esto se denomina búfer de asociación de traducción ( TLB ), que es un caché de asociación.
Cuando es necesario convertir una dirección virtual en una dirección física, primero se busca la TLB. Si se encuentra una coincidencia (llamada " hit TLB " ), se devuelve la dirección física y el acceso a la memoria puede continuar. Sin embargo, si no hay ninguna coincidencia (lo que se denomina "error de TLB "), el módulo de administración de memoria o el controlador de errores de TLB del sistema operativo buscan una coincidencia de dirección en la tabla de páginas para ver si existe una coincidencia (lo que se denomina " recorrido de página "). " ). Si existe la asignación, se vuelve a escribir en la TLB (esto debe hacerse porque el hardware accede a la memoria a través de la TLB en el sistema de memoria virtual) y se reinicia la instrucción actual (que también puede ocurrir en paralelo).
Las búsquedas en la tabla de páginas pueden fallar por dos motivos:
Cuando la memoria física no está llena, esta es una operación simple: la página se vuelve a escribir en la memoria física, la tabla de páginas y el TLB se actualizan y la instrucción se reinicia. Sin embargo, cuando la memoria física está llena, se deben paginar una o más páginas en la memoria física para dejar espacio para la página solicitada. La tabla de páginas debe actualizarse para 1) tener en cuenta que las páginas que estaban previamente en la memoria física ya no están allí y 2) tener en cuenta que la página que estaba en el disco ahora está en la memoria física. También debe actualizar el TLB, incluida la eliminación de la página descargada y el reinicio de la instrucción.
Los sistemas de tablas de páginas más simples a menudo mantienen una tabla de marcos y una tabla de páginas. La tabla de marcos contiene información sobre qué marcos se muestran. En sistemas más avanzados, la tabla de marcos también puede contener información sobre a qué espacio de direcciones pertenece la página, información estadística u otra información de referencia.
La tabla de páginas contiene una asignación entre una dirección de página virtual y una dirección de marco físico. También hay información auxiliar sobre la página, como el bit actual, el bit sucio o modificado, el espacio de direcciones o la ID del proceso, por ejemplo.
El almacenamiento secundario, como un disco duro, se puede utilizar para aumentar la memoria física. Las páginas se pueden paginar fuera de la memoria física y del disco. El bit actual puede indicar qué páginas están actualmente en la memoria física o en el disco, y puede indicar cómo manejar estas diferentes páginas, es decir, si cargar una página desde el disco y si sacar otra página en la memoria física.
El bit sucio le permite optimizar el rendimiento. Una página en el disco que se pagina en la memoria física, luego se lee y luego se vuelve a paginar no necesita volver a escribirse en el disco porque la página no ha cambiado. Sin embargo, si se ha escrito una página después de haberla intercambiado, se establecerá su parte sucia, lo que indica que la página debe volver a escribirse en el almacén de respaldo. Esta estrategia requiere que el almacén de respaldo conserve una copia de la página después de que se haya movido a la memoria. Cuando no se usa el bit sucio, el almacenamiento de respaldo solo debe ser igual al tamaño total instantáneo de todas las páginas paginadas en un momento dado. Cuando se usa el bit sucio, siempre existirán algunas páginas tanto en la memoria física como en el almacén de respaldo.
Los sistemas operativos que no son sistemas operativos de espacio de direcciones único necesitan espacio de direcciones o información de ID de proceso para que el sistema de administración de memoria virtual sepa qué páginas están asociadas con qué proceso. Dos procesos pueden usar dos direcciones virtuales idénticas para diferentes propósitos. La tabla de páginas debe proporcionar diferentes asignaciones de memoria virtual para los dos procesos. Esto se puede hacer asignando diferentes ID de mapa de direcciones a los dos procesos o usando ID de proceso. La asociación de ID de proceso con páginas de memoria virtual también puede ayudar a seleccionar qué páginas mostrar por página, ya que es menos probable que las páginas asociadas con procesos inactivos, en particular procesos cuya página de códigos principal se haya intercambiado, se necesiten de inmediato que las páginas propiedad de activos. procesos. .
Como alternativa al etiquetado de las entradas de la tabla de páginas con ID de proceso únicos, la propia tabla de páginas puede ocupar diferentes páginas de memoria virtual para cada proceso, de modo que la tabla de páginas se convierte en parte del contexto del proceso. En tal implementación, la tabla de páginas de un proceso se puede paginar cada vez que el proceso ya no está en la memoria.
La dirección utilizada en el código de máquina, es decir, el valor del puntero, se denomina "dirección virtual".
La dirección que el procesador pone en el bus se denomina "dirección lineal" (que luego se convierte en una dirección física).
La entrada de la tabla de páginas normalmente contiene la siguiente información:
El número de registros en una tabla es limitado y depende del tamaño del registro y del tamaño de la página. Se utiliza una organización de tablas de varios niveles, a menudo de 2 o 3 niveles, a veces de 4 niveles (para arquitecturas de 64 bits).
En el caso de 2 niveles, se utiliza un "catálogo" de páginas, que almacena entradas que apuntan a las direcciones físicas de las tablas de páginas. Las tablas contienen registros que apuntan a páginas de datos.
Cuando se utiliza una organización de 3 niveles, se agrega un superdirectorio que contiene entradas que apuntan a varios directorios.
Los bits superiores de la dirección virtual indican el número de la entrada en el directorio, los del medio indican el número de la entrada en la tabla, los bits inferiores (la dirección dentro de la página) van a la dirección física sin traducción.
El formato de las entradas de la tabla, su tamaño, el tamaño de la página y la organización de las tablas dependen del tipo de procesador y, a veces, también de su modo de funcionamiento.
Históricamente, x86 ha utilizado PTE de 32 bits, direcciones virtuales de 32 bits, páginas de 4 KB, 1024 entradas de tabla, tablas de dos niveles. Los 10 bits superiores de la dirección virtual son el número de entrada en el directorio, los 10 siguientes son el número de entrada en la tabla, los 12 inferiores son la dirección dentro de la página.
A partir del Pentium Pro, el procesador admite páginas de 4 MB. Sin embargo, para que el sistema y los programas que se ejecutan en él utilicen páginas de este tamaño, la tecnología de página de 4 MB (páginas enormes) debe estar habilitada correctamente y la aplicación debe estar configurada para utilizar páginas de este tamaño.
El procesador x86 en modo PAE (extensión de dirección física) y en modo x86_64 (modo largo) utiliza PTE de 64 bits (de los cuales no se utilizan realmente todos los bits de dirección física, desde 36 en PAE hasta 48 en algunos x86_64), 32 bits direcciones virtuales, páginas de 4 KB, 512 entradas de tabla, tablas de tres niveles con cuatro directorios y cuatro entradas de superdirectorio. Los 2 bits superiores de la dirección virtual son el número de la entrada en el superdirectorio, los 9 bits siguientes están en el directorio, los 9 bits siguientes están en la tabla. La dirección física del directorio o superdirectorio se carga en uno de los registros de control del procesador .
Cuando se usa PAE , se usan páginas de 2 MB en lugar de páginas grandes de 4 MB. Véase también PSE .
En la arquitectura x86_64 es posible utilizar páginas de 4 kilobytes (4096 bytes), 2 megabytes y (en algunos AMD64) 1 gigabyte.
Si el acceso a la memoria no se puede traducir a través de la TLB, el microcódigo del procesador accede a las tablas de páginas e intenta cargar el PTE desde allí en la TLB. Si los problemas persisten después de tal intento, entonces el procesador ejecuta una interrupción especial llamada “ fallo de página ” (fallo de página). El controlador de esta interrupción se encuentra en el subsistema de memoria virtual del kernel del sistema operativo.
Algunos procesadores (MIPS) no tienen microcódigo para acceder a la tabla y generan una falla de página inmediatamente después de una búsqueda fallida en el TLB, el acceso a la tabla y su interpretación ya están asignados al manejador de fallas de página. Esto elimina el requisito de que las tablas de páginas se ajusten a un formato codificado a nivel de hardware.
Causas de fallo de página ( fallo de página ):
El controlador de fallas del kernel puede cargar la página deseada desde un archivo o desde el área de intercambio (ver intercambio ), puede crear una copia de solo lectura de la página disponible para escritura, o puede generar una excepción (en términos de UNIX, la señal SIGSEGV ) en este proceso.
Cada proceso tiene su propio conjunto de tablas de páginas. El registro del directorio de páginas se vuelve a cargar en cada cambio de contexto de proceso . También es necesario restablecer la parte de la TLB que se aplica a este proceso.
En la mayoría de los casos, el kernel del sistema operativo se coloca en el mismo espacio de direcciones que los procesos, y los 1 o 2 gigabytes superiores del espacio de direcciones de 32 bits de cada proceso están reservados para él. Esto se hace para evitar cambiar las tablas de páginas al entrar y salir del núcleo. Las páginas del kernel están marcadas como inaccesibles para el código de modo de usuario.
La región de memoria que contiene el kernel suele ser idéntica para todos los procesos, pero algunas de sus subregiones (por ejemplo, la región del kernel de Windows que contiene el subsistema de gráficos y el controlador de video) pueden ser diferentes para diferentes grupos de procesos (sesiones).
Dado que la memoria del kernel es la misma para todos los procesos, no es necesario recargar los TLB correspondientes después de un cambio de proceso. Para esta optimización, x86 admite el indicador "global" en el PTE.
![]() |
---|