Red de conocimientos turísticos - Conocimientos sobre calendario chino - ¿Cuál es la historia de desarrollo del modelo de gestión de memoria?

¿Cuál es la historia de desarrollo del modelo de gestión de memoria?

La siguiente expresión está tomada de blogs.com/hibernate6/archive/2010/09/25/2522049.html

El bus de direcciones de la CPU de 32 bits se ha ampliado a 32 bits. , Que es el mismo que el ancho del bus de datos. Por lo tanto, en realidad no es necesario utilizar la expresión de dirección "dirección física = segmento: desplazamiento" en una máquina de 32 bits. Resulta que el requisito en las máquinas de 16 bits de que cada segmento no debe tener más de 64 kb no es necesario en las máquinas de 32 bits. Por lo tanto, para una máquina de 32 bits, el método más simple es utilizar un número de 32 dígitos para identificar la dirección de almacenamiento de un byte. Al realizar el direccionamiento, solo necesita proporcionar un número de 32 dígitos para encontrar la dirección directamente. Este modelo de almacenamiento de direcciones pertenece al "modelo de almacenamiento plano".

Sin embargo, los nuevos productos generalmente esperan seguir el principio de "compatibilidad descendente". Por lo tanto, el modo de direccionamiento de 16 bits se conserva por completo en máquinas de 32 bits. Es decir: la capacidad de direccionamiento es de 1 M; el mecanismo de segmentación no supera los 64 kb. Esto se conoce comúnmente como "modo real". Pertenece al "modelo de almacenamiento de direcciones reales" en el modelo de almacenamiento de direcciones.

En segundo lugar, considerando que los programas suelen ser módulos funcionales, aunque la segmentación no es necesaria, la segmentación puede mejorar en gran medida la eficiencia de la gestión del programador. Por lo tanto, las máquinas de 32 bits también utilizan el modo segmento + desplazamiento para el direccionamiento. Pero la diferencia con el modelo real es que, dado que las líneas de dirección y las líneas de datos tienen el mismo ancho, cada segmento puede tener hasta 4G y la dirección base del segmento también es de 32 bits sin procesamiento de desplazamiento a la izquierda. En el modelo de almacenamiento de direcciones, esto pertenece al "modelo de almacenamiento de direcciones de segmento". Sin embargo, cabe señalar que en una máquina de 32 bits, aunque los registros generales, registros de banderas, etc. se han ampliado a 32 bits, los registros de segmento siguen siendo de 16 bits (por qué no hacer cambios, supongo que puede ser para facilitar la compatibilidad con versiones anteriores). Por lo tanto, durante el direccionamiento de 32 bits, lo que se coloca en el registro de segmento ya no es la dirección base del segmento (no hay suficientes dígitos para que quepa) sino un selector. Este selector corresponde a un descriptor de 64 bits de longitud y los 32 bits del descriptor de 64 bits son las direcciones base del segmento. Por lo tanto, en una máquina de 16 bits, la dirección base del segmento se puede encontrar en un solo paso a través del registro de segmento, pero ahora en una máquina de 32 bits, se divide en dos pasos: primero busque el selector y luego busque el segmento. dirección base a través del selector. Se encuentra la dirección base del segmento, más la dirección de desplazamiento, se encuentra la dirección física. Parece que se ha introducido claramente el direccionamiento en modo segmento de 32 bits. De hecho, la historia aquí está lejos de terminar.

En el proceso descrito brevemente anteriormente, es fácil encontrar que hay dos cuestiones que no han sido explicadas. (1) ¿Cómo corresponde la CPU a los selectores y descriptores? (2) Dado que es un descriptor de 64 bits y se utilizan 32 bits para representar la dirección base, ¿para qué se utilizan los 32 bits restantes? Además, cuando se desarrollaron las computadoras de 32 bits, los sistemas operativos también lograron grandes avances. El modo DOS de tarea única fue reemplazado por ventanas multitarea. En otras palabras, a menudo hay más de un programa residiendo en la memoria ahora, y es probable que haya varios programas en la memoria al mismo tiempo. Ahora que no hay límite en el tamaño del segmento, es muy probable que los programas compitan entre sí por las direcciones de los demás. Si se destruye el programa principal, la computadora fallará. Esto es como conducir en la carretera. Si solo hay un automóvil conduciendo, puede conducir de cualquier manera, pero si hay demasiados automóviles y no hay reglas de tránsito, los automóviles competirán por la carretera y la carretera quedará paralizada. Por lo tanto, en el caso de la multitarea, se debe formular una "norma de tráfico" para abordarla, a fin de garantizar el funcionamiento ordenado del sistema multitarea. ¿Qué tipo de reglas deberían establecerse? En primer lugar, dado que el programa captura inconscientemente la dirección de otros programas, si el proceso de direccionamiento incluye un proceso de consulta, puede evitar efectivamente la captura de direcciones. En otras palabras, primero hay que preguntarse si esa dirección ya está ocupada por un segmento del programa. Al mismo tiempo, el segmento de programa que ha ocupado la dirección también debe informar a la CPU su propia información de longitud además de su dirección base. De esta manera se pueden consultar fácilmente otros segmentos del programa. En segundo lugar, el abordaje multitarea debería incluir preferiblemente niveles de prioridad para dar paso a programas básicos en emergencias. Esto es como estar en la carretera. En circunstancias normales, hay que respetar las reglas al salir del coche, pero si se trata de un coche de policía o una ambulancia realizando una misión, puede dar prioridad a los carriles de otros coches. Por lo tanto, también debería definirse una prioridad. Luego, el segmento de programa que ocupa la dirección superior le dice a la CPU su nivel de prioridad. En términos generales, el concepto de "segmento", que originalmente era muy simple en las computadoras de 16 bits, ahora se ha vuelto complicado.

Al igual que el proceso de crecimiento de una persona, su pensamiento siempre es muy ingenuo al principio y, en consecuencia, sólo puede resolver problemas simples. Sólo cuando su pensamiento se deshace de la ingenuidad, podrá resolver cosas más complejas. Ahora que la CPU se está deshaciendo de los ingenuos 16 bits, ciertamente no debería ser tan superficial al describir "segmentos" como lo era en 16 bits. En una máquina de 32 bits, un "segmento" tiene tres elementos: dirección base, longitud y atributos (los atributos incluyen prioridad y otros contenidos). Para citar o dar estos tres elementos completamente a la vez, es necesario definir una nueva estructura de datos. Esta estructura es el descriptor mencionado anteriormente. Cada descriptor ocupa 64 bits y es lo suficientemente largo como para contener los tres elementos del segmento. Por supuesto, ahora hay más de un programa en la memoria y el programa tiene más de un segmento, por lo que no habrá un descriptor, sino muchos. El método de gestión más simple es recopilar todos los descriptores en un espacio de almacenamiento continuo y luego asignar números de serie a cada descriptor. Cuando busque un descriptor específico, simplemente busque el espacio de almacenamiento continuo y luego proporcione el número de secuencia. Estos descriptores reunidos forman una tabla, por lo que generalmente se la denomina tabla de descriptores. Por lo tanto, si desea encontrar información sobre un segmento, primero debe buscar la tabla de descriptores. En otras palabras, para encontrar un descriptor específico, primero debe conocer la dirección base de la tabla de descriptores. En una CPU de 32 bits, hay un registro especial de 48 bits que se utiliza para almacenar información de la tabla de descriptores globales. Este registro se llama GDTR. Entre ellos, los 32 bits superiores dan la dirección base de la tabla de descriptores global y los 16 bits inferiores dan el límite de longitud de la tabla de descriptores. Por lo tanto, una tabla de descriptores globales puede tener hasta 64 kb. Luego, se pueden colocar hasta 64kb/8b=8k descriptores. Así que si quieres seleccionar algún descriptor entre ellos, puedes hacerlo con 13 bits. En una CPU de 32 bits, los 13 bits superiores del registro de segmento de 16 bits se utilizan para almacenar el número de secuencia de un descriptor específico. De hecho, la función del registro de segmento ahora es seleccionar descriptores. Por esta razón, el registro de segmento generalmente se denomina selector. Bueno, después de una larga introducción, el proceso de direccionamiento de segmentos de 32 bits ahora es vagamente visible: busque el número de secuencia en el registro de segmento, busque la dirección base de la tabla de descriptores globales en GDTR y luego encuentre el descriptor de destino. Luego tome la dirección base del segmento del descriptor y luego agregue la dirección de desplazamiento, para obtener la "dirección física" del segmento.

Es realmente emocionante. Este proceso de direccionamiento proporciona una sólida garantía para la ejecución de tareas múltiples. ¡Puedes imaginar que se trata de un salto en el rendimiento de ejecución de la computadora! A partir de ahora, la CPU de alta velocidad ya no tendrá que preocuparse por ser inútil: podrá maximizar su velocidad y realizar múltiples tareas al mismo tiempo. Sí, tenemos motivos para emocionarnos cuando aparecen nuevos paisajes ante nuestros ojos. Sin embargo, no debemos dormirnos en los laureles. Debemos seguir avanzando a lo largo del rayo de luz que nos deja el nuevo mundo para encontrar este nuevo mundo. De esta manera la gente continúa mejorando las cosas. En este punto, nuestra comprensión del proceso de direccionamiento es sólo el comienzo, pero es un buen comienzo. Nos hemos dado cuenta de las poderosas ventajas de la CPU de 32 bits. Esto es suficiente para hacernos esperar un direccionamiento completo de CPU de 32 bits. ¡Levantemos nuestra moral y sigamos avanzando siguiendo los pasos de nuestros predecesores!

Sabemos que el código y los datos del programa deben residir en la memoria para poder ejecutarse. Sin embargo, la cantidad de memoria del sistema es muy limitada y, a menudo, no puede acomodar todo el código y los datos de un programa completo, por no mencionar. Ahora que es un sistema multitarea, obviamente es imposible querer que todos los programas de tareas residan en la memoria. El sistema antiguo divide el programa en partes pequeñas, dejando en la memoria solo la parte que el sistema actual necesita para ejecutarlo, y las otras partes se dejan en el disco duro. Una vez que el sistema ha procesado el fragmento de tarea actual, cargará el siguiente fragmento de tarea que se ejecutará desde la memoria externa, y el propio programador completa este trabajo. Obviamente, esto aumenta la carga para los programadores.

Como resultado, se desarrolló una tecnología de memoria virtual para sistemas multitarea. La tecnología de memoria virtual es un método de asignación de memoria dinámica bajo demanda que es asumida por el sistema operativo. Permite que el programa utilice, sin saberlo, un espacio de almacenamiento mayor que el espacio físico real (en realidad, el espacio de almacenamiento requerido por el programa se almacena en). en forma de páginas). en memoria física y en disco). La memoria virtual combina el espacio del disco duro del sistema y la memoria real del sistema para que la utilice el proceso, proporcionando al proceso un espacio virtual que es mucho mayor que la memoria.

Cuando el programa se está ejecutando, una pequeña parte del espacio de direcciones virtuales se asigna a la memoria y el resto se almacena en el disco duro (es decir, el espacio virtual del programa es igual a la memoria física real más parte del espacio del disco duro). ). Cuando la dirección virtual a la que se accede no está en la memoria, significa que la dirección no está asignada a la memoria, sino que se almacena en el disco duro, por lo que la dirección de almacenamiento virtual requerida se transfiere inmediatamente a la memoria; la memoria del sistema es escasa. Puede cambiar el espacio de almacenamiento virtual actualmente no utilizado al disco duro para liberar espacio de memoria física. De esta manera, para mejorar el rendimiento del sistema, se ha desarrollado tecnología de memoria virtual. En consecuencia, las CPU de 32 bits también deberían desarrollar una nueva tecnología de direccionamiento para administrar la memoria virtual. Esto se logra a través del mecanismo de la página.

Debido al uso del mecanismo de página, la dirección convertida a través del mecanismo de segmento mencionado anteriormente solo se usa como una dirección intermedia: una dirección lineal. Esta dirección no representa la dirección física real, sino que representa la dirección. todo el proceso. dirección del espacio virtual. También debe haber un proceso de conversión de direcciones virtuales en direcciones físicas.

Conozcamos el mecanismo de la página. Divide la memoria en páginas consecutivas, cada página tiene un tamaño de 4kb. A diferencia de los segmentos, las páginas no son representaciones de bloques de funciones del programa. Un bloque de funciones de programa puede ocupar varias páginas. Ahora la memoria es como un libro, página por página, y la capacidad de cada página es igual. Por supuesto, podemos pensar rápidamente que si queremos encontrar una determinada página rápidamente, lo mejor es dividir el libro en capítulos o secciones y luego buscar nivel por nivel. Ésta es la función de los directorios de páginas y las tablas de páginas en las CPU de 32 bits. La longitud del directorio de páginas es de 4 kb. Puede contener hasta 1024 entradas del directorio de páginas. Cada entrada del directorio de páginas es de 32 bits y contiene la dirección de la tabla de páginas e información relacionada. Por lo tanto, el directorio de páginas divide el espacio de 4 Gb en 1024 grupos de páginas, cada grupo de páginas tiene un tamaño de 4 MB. La longitud de la tabla de páginas también es de 4 kb, con 1024 entradas de la tabla de páginas. Cada entrada de la tabla de páginas es de 32 bits, incluida la dirección de la página y otra información. De esta manera, el grupo de páginas de 4 MB se divide en 1024 páginas, cada tamaño de página es de 4 kb. Entonces, encontrar una página es un proceso que consiste en verificar primero el directorio de páginas y luego la tabla de páginas. Para encontrar el directorio de la página, necesitamos saber su dirección base. En una CPU de 32 bits, los 20 bits superiores del registro CR3 contienen la dirección del directorio de páginas, porque los 12 bits inferiores del directorio de páginas son siempre 0, lo que garantiza que el directorio de páginas siempre esté alineado con la página (cada tamaño de página es de 4kB). Echemos un vistazo a la dirección lineal encontrada anteriormente mediante el mecanismo de segmento de 32 bits. Los 10 bits superiores son la dirección de desplazamiento del directorio de páginas. Un máximo de 1024 directorios de páginas pueden utilizar 10 bits para identificar el desplazamiento máximo posible. Al agregar CR3, puede encontrar el directorio de páginas y luego encontrar la dirección base de la tabla de páginas a través del directorio de páginas. Los 10 bits centrales de la dirección lineal contienen el desplazamiento de la tabla de páginas, encontrando así la tabla de páginas. Finalmente, la tabla de páginas se encuentra agregando la dirección base de la tabla de páginas a la dirección de desplazamiento de la tabla de páginas representada por los 12 bits más bajos de CR3. La dirección de esta página es la dirección física final.

Como se mencionó anteriormente, la razón por la que se utiliza el mecanismo de página es para la tecnología de memoria virtual. Entonces, ya sea un directorio de páginas o una tabla de páginas, además de la información de la dirección, también hay información de atributos, como si la tabla de páginas actual está en la memoria, etc. De esta manera, es conveniente que el sistema administre la memoria virtual e implemente la función de intercambio de entrada y salida. No entraré en detalles aquí.

En términos generales, el direccionamiento de 32 bits primero encuentra una dirección de 32 bits a través del mecanismo de segmento de 32 bits. Si no se utiliza la paginación, entonces es la dirección física. De lo contrario, es solo una dirección lineal y luego la dirección de la página se encuentra a través de CR3, el directorio de páginas y la tabla de páginas, que es la dirección física final. De hecho, todavía hay muchos detalles que no se han cubierto. Por ejemplo, la tabla de descriptores mencionada aquí es una tabla de descriptores globales. De hecho, también hay tablas de descriptores locales. Otro ejemplo es que el descriptor solo se centra en el bit de dirección. , bit de prioridad y otros atributos Sin ninguna introducción. Sin embargo, ante nuestros ojos ya se está desplegando una imagen completa del abordaje. Contiene todos los mecanismos importantes en las CPU de 32 bits. Es mejor que no hagas las preguntas restantes por el momento y utilices el método que estás aprendiendo ahora.