Espacio de direcciones del proceso del kernel de Linux

Este artículo toma prestado de: https://www.cnblogs.com/fengliu-/p/9243004.html
https://blog.csdn.net/wsq119/article/details/82110757
https://www.cnblogs.com/ wuchanming / p / 4339770.html

Diagrama de distribución del espacio de direcciones del proceso:
Inserte la descripción de la imagen aquí
Segmento de programa (Texto): El mapeo del código del programa en la memoria, almacenando el código binario del cuerpo de la función.
Datos inicializados (datos): los datos que se han inicializado a variables al comienzo del programa.
Datos no inicializados (BSS): Los datos que no han inicializado las variables al comienzo de la operación del programa.
Pila: Almacena variables locales y temporales, cuando se llama a la función, almacena el puntero de retorno de la función, que se utiliza para controlar la llamada y retorno de la función. La memoria se asigna automáticamente al principio del bloque de programa y la memoria se libera automáticamente al final El modo de operación es similar a la pila en la estructura de datos.
Montón: asignación de memoria dinámica de almacenamiento, que requiere asignación manual y liberación manual por parte del programador. Tenga en cuenta que es diferente del montón en la estructura de datos, y el método de asignación es similar a una lista vinculada.

Mecanismo de asignación de memoria temprana

En las primeras computadoras, para ejecutar un programa, todos estos programas se cargaban en la memoria y el programa se ejecutaba directamente en la memoria, es decir, las direcciones de memoria a las que se accedía en el programa eran las direcciones de memoria física reales. Cuando una computadora ejecuta varios programas al mismo tiempo, debe asegurarse de que la cantidad total de memoria utilizada por estos programas sea menor que el tamaño de la memoria física real de la computadora.
Cuando un programa ejecuta varios programas al mismo tiempo, ¿cómo asigna el sistema operativo memoria para estos programas? El siguiente es un ejemplo para ilustrar el método de asignación de memoria en ese momento: el
tamaño de memoria total de una computadora es 128M, y ahora dos programas A y B se están ejecutando al mismo tiempo, A necesita ocupar 10M de memoria y B necesita para ocupar 110 de memoria. Cuando la computadora asigna memoria al programa, adoptará este método: primero asigne los primeros 10M de la memoria al programa A, y luego divida 110M de los 118M restantes en la memoria y lo asigne al programa B. Este método de asignación puede garantizar que tanto el programa A como el programa B puedan ejecutarse, pero esta simple estrategia de asignación de memoria tiene muchos problemas.

Segmentario

Para resolver los problemas anteriores, la gente pensó en una solución alternativa, que es agregar una capa intermedia y usar un método de acceso de dirección indirecta para acceder a la memoria física. Según este método, la dirección de memoria a la que se accede en el programa ya no es una dirección de memoria física real, sino una dirección virtual, y luego el sistema operativo asigna esta dirección virtual a una dirección de memoria física apropiada. De esta manera, siempre que el sistema operativo maneje el mapeo de direcciones virtuales a direcciones de memoria física, puede asegurar que las direcciones de memoria a las que finalmente acceden diferentes programas estén ubicadas en diferentes áreas sin superponerse entre sí, y el efecto del espacio de direcciones de memoria. se puede lograr el aislamiento.
Cuando se crea un proceso, el sistema operativo asigna un espacio de direcciones de proceso virtual de 4 GB para el proceso. La razón por la que es de 4 GB es porque en un sistema operativo de 32 bits, un puntero tiene 4 bytes de longitud y la capacidad de direccionamiento de un puntero de 4 bytes es de 0x00000000 a 0xFFFFFFFF, y el valor máximo 0xFFFFFFFF representa una capacidad de 4 GB. . A diferencia del espacio de direcciones virtuales, también hay un espacio de direcciones físicas, que corresponde a la memoria física real. Si 512M de memoria está instalada en su computadora, el rango de este espacio de direcciones físicas es 0x00000000 ~ 0x1FFFFFFF. Cuando el sistema operativo asigna una dirección virtual a una dirección física, solo se puede asignar a este rango y el sistema operativo solo se puede asignar a este rango. Cuando se crea un proceso, cada proceso tendrá su propio espacio de direcciones virtuales de 4 GB. Cabe señalar que este espacio de direcciones de 4GB es "virtual", no real, y cada proceso solo puede acceder a datos en su propio espacio de direcciones virtuales y no puede acceder a datos en otros procesos. Esto se logra mediante este método Aislamiento de direcciones entre procesos.
La razón por la que la gente quiere crear un espacio de direcciones virtual es resolver el problema del aislamiento del espacio de direcciones del proceso. Pero si el programa quiere ejecutarse, debe hacerlo en memoria real, por lo que se debe establecer una relación de mapeo entre la dirección virtual y la dirección física. De esta manera, a través del mecanismo de mapeo, cuando un programa accede a un valor de dirección en el espacio de direcciones virtuales, es equivalente a acceder a otro valor en el espacio de direcciones físicas. La gente piensa en un método de segmentación, cuya idea es hacer un mapeo uno a uno entre el espacio de direcciones virtual y el espacio de direcciones físicas. Por ejemplo, un espacio de 10M en el espacio de direcciones virtuales se asigna a un espacio de 10M en el espacio de direcciones físicas. Esta idea no es difícil de entender, el sistema operativo asegura que el espacio de direcciones de diferentes procesos esté mapeado a diferentes áreas en el espacio físico de direcciones, de modo que cada proceso finalmente acceda a él.
Los espacios de direcciones físicas están separados entre sí. De esta manera, se logra el aislamiento de direcciones entre procesos. Tomemos un ejemplo para ilustrarlo. Supongamos que hay dos procesos A y B. El tamaño de la memoria del proceso A es 10M, su espacio de direcciones virtuales se distribuye de 0x00000000 a 0x00A00000, la memoria requerida por el proceso B es 100M y su espacio de direcciones virtuales se distribuye de 0x00000000 a 0x06400000. Luego, de acuerdo con el método de mapeo segmentado, el proceso A mapea el área en la memoria física de 0x00100000 a 0x00B00000, y el proceso B mapea el área en la memoria física de 0x00C00000 a 0x07000000. Por lo tanto, el proceso A y el proceso B se asignan respectivamente a diferentes rangos de memoria y no se superponen entre sí, lo que permite el aislamiento de direcciones. Desde la perspectiva del programa de aplicación, el espacio de direcciones del proceso A se distribuye de 0x00000000 a 0x00A00000. Durante el desarrollo, los desarrolladores solo necesitan acceder a las direcciones en este rango. Al programa de aplicación no le importa que el proceso A se asigne al área de la memoria física, por lo que la dirección de ejecución del programa es equivalente a estar determinada.
Aunque este método de mapeo segmentado resuelve el primer y tercer problema mencionado anteriormente, no resuelve el segundo problema, es decir, el problema de la eficiencia del uso de la memoria. En el método de mapeo segmentado, cada vez que se cambia la memoria hacia adentro y hacia afuera es el programa completo, lo que provocará una gran cantidad de operaciones de acceso al disco, lo que resultará en una baja eficiencia. Por lo tanto, este método de mapeo todavía es un poco tosco y la granularidad es relativamente grande. De hecho, el funcionamiento del programa tiene las características de localidad. En un período de tiempo determinado, el programa solo accede a una pequeña parte de los datos del programa, es decir, la mayoría de los datos del programa no serán utilizados en un cierto período de tiempo. En base a esta situación, la gente piensa en un método de segmentación y mapeo de memoria con una granularidad menor: este método es la paginación.

Paginación

El método básico de paginación es dividir el espacio de direcciones en muchas páginas. El tamaño de cada página lo determina la CPU y luego el sistema operativo selecciona el tamaño de la página. En la actualidad, la CPU de la serie Inter admite un tamaño de página de 4 MB o 4 MB, mientras que la PC actualmente elige usar 4 KB. Según esta elección, el espacio de direcciones virtuales de 4 GB se puede dividir en 1048576 páginas y la memoria física de 512 M se puede dividir en 131072 páginas. Obviamente, la cantidad de páginas en el espacio virtual es mucho mayor que la cantidad de páginas en el espacio físico.
En el método de segmentación, el programa siempre se carga en la memoria cada vez que se ejecuta, pero el método de paginación es diferente. La idea de la paginación es asignar memoria para qué página se usa cuando el programa se está ejecutando, y las páginas no utilizadas se guardan temporalmente en el disco duro. Cuando se utilizan estas páginas, se asigna memoria para estas páginas en el espacio de direcciones físicas, y luego se establece un mapeo entre las páginas en el espacio de direcciones virtuales y las páginas de memoria física recién asignadas.
A continuación se describe la implementación del mecanismo de paginación mediante la introducción del proceso de carga de un archivo ejecutable. Un archivo ejecutable (archivo PE) es en realidad una colección de datos e instrucciones compilados y enlazados. También se dividirá en muchas páginas. Durante la ejecución del archivo PE, la unidad que carga en la memoria es la página. Cuando se ejecuta un archivo PE, el sistema operativo primero creará un espacio de dirección virtual de proceso de 4GB para el programa. Como se mencionó anteriormente, el espacio de direcciones virtuales es solo una capa intermedia. Su función es utilizar un mecanismo de mapeo para asignar el espacio de direcciones virtuales al espacio de direcciones físicas. Por lo tanto, crear un espacio de direcciones virtuales de 4 GB no es realmente crear espacio, sino que La estructura de datos necesaria para crear ese mecanismo de mapeo no es más que la estructura de datos del encabezado de página y la tabla de página.
Después de crear la estructura de datos requerida por el espacio de direcciones virtuales, el proceso comienza a leer la primera página del archivo PE. La primera página del archivo PE contiene información como el encabezado del archivo PE y la tabla de segmentos. De acuerdo con el encabezado del archivo y la tabla de segmentos, el proceso asigna todos los segmentos del archivo PE a las páginas correspondientes en el espacio de direcciones virtuales (en el Archivo PE) .La longitud del segmento es un múltiplo entero de la longitud de la página). En este momento, las instrucciones reales y los datos del archivo PE no se han cargado en la memoria. El sistema operativo solo establece la relación de mapeo entre el archivo PE y la página en el espacio de direcciones virtuales del proceso de acuerdo con el encabezado y otra información de el archivo PE. Cuando la CPU quiere acceder a una determinada dirección virtual utilizada en el programa, cuando la CPU encuentra que la dirección no tiene una dirección física asociada, la CPU piensa que la página donde se encuentra la dirección virtual es una página vacía y la CPU piensa es un error de página (Page Fault), la CPU también sabe que el sistema operativo no ha asignado memoria a la página PE y la CPU devolverá el control al sistema operativo. El sistema operativo luego asigna una página en el espacio físico para la página PE, y luego mapea la página física con la página virtual en el espacio virtual, y luego devuelve el control al proceso, y el proceso se reinicia desde la posición donde la página La falla ocurrió hace un momento. Dado que se ha asignado memoria para esa página del archivo PE en este momento, no se producirá el error de página. Con la ejecución del programa, las fallas de página continuarán ocurriendo y el sistema operativo asignará las páginas físicas correspondientes para que el proceso satisfaga las necesidades del proceso.
La idea central del método de paginación es que cuando el archivo ejecutable se ejecuta en la página x, se asigna una página de memoria y para la página x, y luego esta página de memoria se agrega a la tabla de mapeo del espacio de direcciones virtuales del proceso. Esta tabla de mapeo es equivalente en una función y = f (x). La aplicación puede acceder a la página y asociada con la página x a través de esta tabla de mapeo.
De lo anterior podemos saber que en el proceso de creación del proceso,Todo el contenido del programa se asigna al espacio de memoria virtual del proceso. Para permitir que un programa grande se ejecute en un espacio de memoria física limitado, podemos cargar la parte inicial del programa en el espacio de memoria física para ejecutarlo, porque el sistema operativo se ocupa del proceso. Si descubre que la dirección física no existe en el proyecto de conversión de dirección virtual a física, se producirá un error de página (nopage) en este momento y, a continuación, el sistema operativo cargará el disco que no se ha cargado en la memoria Los datos se cargan en la memoria física y se actualiza la tabla de páginas de proceso correspondiente . Puede preguntar, si la memoria física está llena en este momento, ¿qué hará el sistema operativo?
Echemos un vistazo a cómo lo maneja el sistema operativo Linux:
si un proceso quiere cargar una página virtual en la memoria física, pero no no es utilizable. Con páginas físicas libres, el sistema operativo debe eliminar otras páginas en la memoria física para hacer espacio para esta página.
En el sistema operativo Linux, la descripción de la página física es la siguiente:

struct mem_map
{
    
    
1、本页使用计数,当该页被许多进程共享时计数将大于1
2、age描叙本页的年龄,用来判断该页是否为淘汰或交换的好候选
3、map_nr描叙物理页的页帧号
}

Si la página que se elimina de la memoria física proviene de una imagen o archivo de datos y no se ha escrito, no es necesario guardar la página, se puede descartar. Si un proceso necesita la página, puede recuperarla de la imagen o del archivo de datos en la memoria.
Sin embargo, si la página ha sido modificada, el sistema operativo debe conservar el contenido de la página para que se pueda acceder a ella en un momento posterior. Este tipo de página se denomina "página sucia". Cuando se borra de la memoria, se guardará en un archivo especial llamado archivo de intercambio.
En relación con la velocidad del procesador y la memoria física, se necesita mucho tiempo para acceder al archivo de intercambio y el sistema operativo debe dedicar mucho tiempo al tema de escribir páginas en el disco y recuperar memoria cuando se vuelven a utilizar.
Si el algoritmo utilizado para determinar qué página se elimina o intercambia no es lo suficientemente eficiente, puede ocurrir una situación llamada "jitter". En este caso, la página siempre se escribe en el disco y se vuelve a leer, y el sistema operativo está demasiado ocupado para realizar un trabajo real.
Linux utiliza la técnica de paginación "Menos recientemente usada (LRU)" para elegir de manera justa qué página se puede eliminar del sistema. Cada página de este sistema de diseño tiene una "edad", y la edad cambia a medida que se accede a la página. Cuanto más visitada es la página, más joven es; cuanto menos visitada, más antigua. La página anterior es la mejor página candidata para el intercambio.

organización de almacenamiento virtual linux

Cada proceso (subproceso) corresponde a un descriptor de proceso (task_struct), cada descriptor de proceso tiene un descriptor de memoria (mm_struct) que es el espacio de direcciones de proceso único, y el descriptor de memoria contiene una lista vinculada del área de memoria virtual (vm_area_struct) que se usa para identificar el área utilizada en el espacio de direcciones
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/chengcheng1024/article/details/114382951
Recomendado
Clasificación