Kernel de Linux: administración de memoria

La función principal de la unidad de gestión de memoria MMU (unidad de gestión de memoria) es la conversión de direcciones virtuales (direcciones de memoria virtual) en direcciones físicas (direcciones físicas). Además, también puede implementar funciones como protección de memoria, control de caché, arbitraje de bus y cambio de banco. Este artículo presentará en detalle las razones históricas del surgimiento de la MMU, así como su función y principio de funcionamiento.

Antecedentes de la generación de MMU

En los primeros días de la computadora, sus recursos de memoria eran muy limitados, generalmente solo decenas de cientos de KB, y el tamaño del programa en ese momento también era pequeño.Para los programas en ese momento, los recursos de memoria a nivel de KB todavía eran suficientes. Sin embargo, con el desarrollo de la tecnología informática, la escala de los programas de aplicación continúa expandiéndose y finalmente aparece un problema frente a los programadores, es decir, el programa de aplicación es demasiado grande y la memoria ya no puede acomodar un programa tan grande.

La solución original a este problema fue dividir el programa en muchas partes llamadas superposiciones. El bloque de superposición 0 se ejecuta primero y llama a otro bloque de superposición al final para continuar ejecutándose.

Aunque el intercambio de bloques de superposición lo realiza el sistema operativo, primero debe dividirlo el programador. Este es un trabajo lento y laborioso, y es bastante aburrido.

La gente tiene que encontrar una mejor manera de resolver fundamentalmente este problema.

Pronto la gente encontró una forma, que es la memoria virtual (memoria virtual).

Memoria virtual

La idea básica de la memoria virtual es:

El tamaño total de programas, datos y pilas puede exceder el tamaño de la memoria física.El sistema operativo mantiene las partes utilizadas actualmente en la memoria y guarda otras partes no utilizadas en el disco.

Por ejemplo, para un programa de 16 MB y una máquina con solo 4 MB de memoria, el sistema operativo puede elegir qué 4 MB guardar en la memoria en cualquier momento e intercambiar fragmentos de programa entre la memoria y el disco cuando sea necesario, de modo que este programa de 16 MB se ejecute en una máquina. con 4 MB de RAM. Y este programa de 16M no necesita ser dividido por el programador antes de ejecutarse.

En cualquier momento, hay un conjunto de direcciones que un programa puede generar en una computadora, lo que llamamos rango de direcciones.

El tamaño de este rango está determinado por el número de bits de la CPU, por ejemplo:

Para una CPU de 32 bits, su rango de direcciones es 0x0 ~ 0xFFFF FFFF (4G),

Y para una CPU de 64 bits, su rango de direcciones es 0x0 ~ 0xFFFF FFFF FFFF FFFF (64T).

Este rango es el rango de direcciones que nuestro programa puede generar. A este rango de direcciones lo llamamos espacio de direcciones virtuales, y una dirección en este espacio se llama dirección virtual.

El espacio de direcciones físicas y la dirección física corresponden al espacio de direcciones virtuales y a la dirección virtual. La mayoría de las veces, el espacio de direcciones físicas de nuestro sistema es solo un subconjunto del espacio de direcciones virtuales. Proporcione un ejemplo simple para ilustrar de manera intuitiva el diferencia entre los dos, para un host x86 de 32 bits con 256 MB de memoria, su rango de espacio de direcciones virtuales es 0x0 ~ 0xFFFF FFFF (4G), mientras que el rango de espacio de direcciones físicas es 0x0000 0000 ~ 0x0FFF FFFF ( 256MB ).

En las máquinas que no utilizan direcciones virtuales, las direcciones virtuales se envían directamente al bus de memoria, lo que permite leer o escribir en el almacenamiento físico con la misma dirección. En el caso del almacenamiento virtual, la dirección virtual no se envía directamente al bus de direcciones de memoria, sino a la unidad de administración de memoria: MMU .

La MMU está compuesta por uno o un grupo de chips, y generalmente existe en el coprocesador, y su función es mapear direcciones virtuales a direcciones físicas.

  1. Lo que ve la CPU es la dirección virtual (la dirección lógica en el programa)
  2. Los cachés y MMU usan MVA (dirección virtual real MVA = (pid << 25) | VA)
  3. El dispositivo físico real utiliza la dirección física (dirección física)

Composición física de la MMU

La unidad de administración de memoria MMU es una unidad de hardware en el procesador, generalmente hay una MMU para cada núcleo. MMU incluye TLB (Búfer de búsqueda de traducción) y Unidad de recorrido de mesa. En términos sencillos, el TLB es el caché de la tabla de páginas, que se utiliza para almacenar en caché la tabla de traducción de la dirección virtual a la dirección física. La función de Table Walk Unit es recorrer la tabla de páginas de memoria para buscar la tabla y completar la conversión de dirección virtual a dirección física.

El TLB se utiliza para almacenar en caché las tablas de páginas de traducción realizadas recientemente. La TLB puede almacenar el tamaño completo de la tabla de páginas y puede dividir la tabla de páginas en unidades más pequeñas cuando sea necesario.

En la MMU, la TLB de dos niveles se divide en: Instrucción L1 TLB, Datos L1 TLB y L2 TLB. El L2 TLB es instrucción-datos compartidos.

Cuando la dirección virtual VA enviada por el programa no puede encontrar la tabla de páginas de conversión correspondiente en la TLB, la unidad Table Walk debe ir a la memoria caché o la memoria del sistema para obtener una nueva tabla de páginas. Actualice la tabla de páginas anterior en la TLB con la nueva tabla de páginas recuperada.

mecanismo de trabajo MMU

 La mayoría de los sistemas que usan memoria virtual usan un proceso llamado paginación.

El espacio de direcciones virtuales se divide en unidades de página y el espacio de direcciones físicas correspondiente también se divide en marcos de página.

Las páginas y los marcos de página deben tener el mismo tamaño.

A continuación, con las imágenes, se utiliza un ejemplo para ilustrar cómo se mapean la página y el marco de la página bajo la programación de la MMU:

En este ejemplo, tenemos una máquina que puede generar direcciones de 16 bits, su dirección virtual varía de 0x0000 ~ 0xFFFF(64k), y esta máquina tiene solo 32 000 direcciones físicas, por lo que puede ejecutar un programa de 64 000, pero el programa no se puede cargar en la memoria al mismo tiempo. correr.

Esta máquina debe tener una memoria externa (como un disco o Flash) que pueda almacenar 64K programas para garantizar que los segmentos del programa se puedan llamar cuando sea necesario.

En este ejemplo, el tamaño de la página es de 64K y el tamaño del marco de la página es el mismo que el de la página (esto debe garantizarse, la transferencia entre la memoria y la memoria periférica siempre es en unidades de páginas), correspondiente a 64K de dirección virtual y 32K memoria física, contienen 16 páginas y 8 marcos de página respectivamente.

Ejecute los siguientes comandos:

MOVE REG,0// 将 0 号地址的值传递进寄存器 REG

La dirección virtual 0 se enviará a la MMU, y la MMU ve que la dirección virtual se encuentra dentro del rango de la página 0 (el rango de la página 0 es de 0 a 4095). En la figura anterior, podemos ver que el (asignado ) el marco de página correspondiente a la página 0 es 2 (el rango de direcciones del marco de página 2 es de 8192 a 12287).

Por lo tanto, la MMU traduce la dirección virtual en una dirección física 8192 y envía la dirección 8192 en el bus de direcciones.

La memoria no sabe nada sobre el mapeo de la MMU, solo ve una solicitud de lectura a la dirección 8192 y la ejecuta, y la MMU resuelve las direcciones virtuales 8192 a 12287 en las direcciones físicas correspondientes 0 a 4096.

MOVE REG , 20500
被转换为---->  MOVE REG, 12308

Debido a que la dirección virtual 20500 está a 20 bytes del comienzo de la página virtual 5 (el rango de direcciones virtuales es de 20480 a 24575), la página virtual 5 se asigna al marco de página 3 (el rango de direcciones del marco de página 3 es de 12288 a 16383), por lo que se asigna a la dirección física 12288 + 20 = 12308.

MOV REG , 32780

La dirección virtual 32780 cae dentro del rango de la página 8. De la figura anterior, podemos ver que la página 8 no ha sido mapeada efectivamente (la página está marcada con una X), ¿qué sucederá en este momento?

La MMU nota que esta página no está mapeada, por lo que notifica a la CPU que ha ocurrido una falla de página. En este caso, el sistema operativo debe lidiar con la falla de página. Debe encontrar uno de los 8 marcos de página físicos que rara vez se usan. Utilice el marco de página y escriba el contenido del marco de página en la memoria periférica (esta acción se denomina copia de página), y luego asigne la página a la que se debe hacer referencia (página 8 en este ejemplo) al marco de página que se recién lanzado (esta acción se llama modificar la relación de mapeo), y luego volver a ejecutar la instrucción de fallo ( MOV REG, 32780).

Suponga que el sistema operativo decide liberar el marco de página 1 para que cualquier acceso posterior a las direcciones virtuales de 4K a 8K provoque un error y haga que el sistema operativo tome las medidas adecuadas.

En segundo lugar, cambia el número de marco de página correspondiente a la página virtual 8 de X a 1, por lo que MOV REG, 32780 debe ejecutarse nuevamente y MMU mapea 32780 a 4180.

Ya sabemos que la mayoría de los sistemas que usan memoria virtual usan una técnica llamada paginación.Al igual que el ejemplo que acabamos de dar, el espacio de direcciones virtuales se divide en un conjunto de páginas del mismo tamaño, y cada página tiene un número de página que se usa para marcar (este número de página es generalmente su índice en el grupo, que es similar a las matrices en C/C++).

En el ejemplo anterior, el número de página de 0~4K es 0, el número de página de 4~8K es 1, el número de página de 8~12K es 2, y así sucesivamente.

La dirección virtual (nota: es una dirección definida, no un espacio) está dividida en dos partes por la MMU, la primera parte es el índice de página (page Index), y la segunda parte es el desplazamiento relativo a la dirección de la encabezado de página (desplazamiento).

Todavía usamos la máquina de 16 bits en este momento para ilustrar un ejemplo con la siguiente figura.En este ejemplo, la dirección virtual 8196 se envía a la MMU, y la MMU la asigna a una dirección física. El rango de direcciones que una CPU de 16 bits puede generar en total es de 0 a 64 K. Según el tamaño de cada página de 4 K, el espacio debe dividirse en 16 páginas. Y el rango que puede expresar la primera parte de nuestra dirección virtual también debe ser igual a 16 (para que todas las páginas del grupo de páginas puedan indexarse), es decir, esta parte necesita al menos 4 bits.

El índice de número de página de esta dirección es 0010(código binario), es decir, la página indexada es la página 2, la segunda parte es 000000000100(código binario) y el desplazamiento es 4.

El número de marco de página en la página 2 es 6 (la página 2 está asignada al marco de página 6, vea la figura anterior), y vemos que la dirección física del marco de página 6 es 24~28K. Entonces, la MMU calcula que la dirección virtual 8196 debe asignarse a la dirección física 24580 (dirección de encabezado de marco de página + desplazamiento = 24576 + 4 = 24580).

De manera similar, si leemos la dirección virtual 1026, el código binario de 1026 es 0000010000000010, page index="0000"=0,offset=010000000010=1026.

El número de página es 0, el número de marco de página asignado a esta página es 2 y el rango de direcciones físicas del marco de página 2 es 8192~12287, por lo que la MMU asigna la dirección virtual 1026 a la dirección física 9218 (dirección principal del marco de página + compensación = 8192+ 1026=9218).

Lo anterior es el proceso de trabajo de la MMU. En una oración, la CPU emitirá una dirección virtual en cualquier momento. Después de enviar la dirección virtual a la MMU, la MMU consultará la dirección física correspondiente a la dirección virtual a través de la tabla de páginas y enviará la dirección física a la memoria. autobús. Este proceso puede denominarse asignación de dirección virtual a dirección física.

gestión de memoria virtual

Los sistemas operativos modernos generalmente adoptan un mecanismo de administración de memoria virtual (Administración de memoria virtual), que requiere el soporte de la MMU (Unidad de administración de memoria, unidad de administración de memoria) en el procesador.

Primero introduzca dos conceptos, dirección virtual y dirección física.

  • Si el procesador no tiene una MMU, o tiene una MMU pero no está habilitada, la dirección de memoria emitida por la unidad de ejecución de la CPU se transmitirá directamente a los pines del chip y será recibida por el chip de memoria física, que se denomina dirección física.
  • Si el procesador tiene la MMU habilitada, la dirección de memoria emitida por la unidad de ejecución de la CPU será interceptada por la MMU. La dirección de la CPU a la MMU se denomina dirección virtual, y la MMU traduce esta dirección a otra dirección y la envía a el pin de dirección externa del chip de la CPU Arriba, es decir, VA se asigna a PA.

Si es un procesador de 32 bits, el bus de direcciones de memoria es de 32 bits y está conectado a la unidad de ejecución de la CPU, pero el bus de direcciones externo convertido por la MMU no es necesariamente de 32 bits.

Es decir, el espacio de direcciones virtuales y el espacio de direcciones físicas son independientes, el espacio de direcciones virtuales de un procesador de 32 bits es de 4 GB y el espacio de direcciones físicas puede ser mayor o menor que 4G.

La MMU asigna VA a PA en unidades de páginas, y el tamaño de página de un procesador de 32 bits suele ser de 4 KB.

Por ejemplo:

0xB7001000 - 0xB7001FFFFLa MMU puede mapear una página del VA a una página del PA a través de una entrada de mapeo 0x2000 ~ 0x2FFF.

Si la unidad de ejecución de la CPU quiere acceder a la dirección virtual 0xB7001008, la dirección física a la que se accede realmente es 0x2008.

Una página en la memoria física se denomina marco de página física (marco de página). Qué página de la memoria virtual se asigna a qué marco de página de la memoria física se describe mediante una tabla de páginas (tabla de páginas). La tabla de páginas se almacena en la memoria física, y la MMU buscará en la tabla de páginas para determinar a qué PA debe asignarse un VA.

La cooperación entre el sistema operativo y la MMU es así: cuando el sistema operativo inicializa o asigna y libera memoria, ejecutará algunas instrucciones para completar la tabla de páginas en la memoria física y luego configurará la MMU con instrucciones para decirle a la MMU donde está la tabla de páginas en la memoria física.

Después de la configuración, cada vez que la CPU ejecuta una instrucción para acceder a la memoria, activará automáticamente la MMU para realizar operaciones de búsqueda de tablas y traducción de direcciones. El hardware completa automáticamente la operación de traducción de direcciones, y no hay necesidad de usar instrucciones para controlar la MMU para hacerlo.

Las variables y funciones que usamos en el programa tienen sus propias direcciones. Después de compilar el programa, estas direcciones se convierten en las direcciones de las instrucciones. Las direcciones de las instrucciones son interpretadas y ejecutadas por la CPU y se convierten en las direcciones de memoria emitidas por la ejecución. unidad de la CPU. , por lo que cuando la MMU está habilitada, las direcciones utilizadas en el programa son todas direcciones virtuales, lo que hará que la MMU realice operaciones de búsqueda de tablas y conversión de direcciones.

Entonces, ¿por qué diseñar un mecanismo de administración de memoria tan complicado?¿Cuáles son los beneficios de agregar una capa adicional de conversión de VA a PA?

Además de la traducción de direcciones, la MMU también proporciona un mecanismo de protección de memoria. Varias arquitecturas se dividen en modo de usuario y modo privilegiado. El sistema operativo puede configurar el acceso de cada página de memoria en la tabla de páginas. Permisos, algunas páginas no pueden solo se puede acceder a algunas páginas cuando la CPU está en modo privilegiado, a algunas páginas se puede acceder tanto en modo de usuario como en modo privilegiado, y los derechos de acceso se dividen en lectura, escritura y ejecución.

Después de esta configuración, cuando la CPU quiera acceder a un VA, la MMU verificará si la CPU está actualmente en el modo de usuario o en el modo privilegiado, y si el propósito de acceder a la memoria es leer datos, escribir datos o buscar instrucciones. Si coincide se permite el acceso y se convierte en PA, si no se permite el acceso se genera una excepción (Exception).

El proceso de manejo de excepciones es similar a la interrupción. La diferencia es que la interrupción es generada por el dispositivo externo y la excepción es generada por la CPU. La causa de la interrupción no tiene nada que ver con la instrucción actualmente ejecutada por la CPU, y la excepción es causada por un problema con la instrucción actualmente ejecutada por la CPU. Por ejemplo, la MMU detecta la instrucción para acceder a la memoria como un error de permiso, y el divisor de la instrucción de división es 0, lo que provocará una excepción. .

Espacio de usuario y espacio del kernel

Por lo general, el sistema operativo divide la dirección virtual en espacio de usuario y espacio del kernel. Por ejemplo, el espacio de direcciones virtuales del sistema Linux de la plataforma X86 es 0x00000000 - 0xFFFFFFFF, los primeros 3 GB ( 0x00000000 - 0xBFFFFFFF) son el espacio del usuario y los últimos 1 GB ( 0xC0000000 - 0xFFFFFFFF) son el espacio del kernel. .

El programa de usuario se carga en el espacio de usuario y se ejecuta en modo de usuario. No puede acceder a los datos en el kernel, ni puede saltar al código del kernel para su ejecución.

Esto puede proteger el kernel.Si un proceso accede a una dirección ilegal, como máximo este proceso se bloqueará sin afectar la estabilidad del kernel y de todo el sistema.

Cuando la CPU genera interrupciones y excepciones, no solo saltará a la rutina de servicio de interrupción o excepción, sino que también cambiará automáticamente de modo de usuario a modo privilegiado, de modo que la rutina de servicio de interrupción o excepción pueda saltar al código del núcleo para su ejecución.

De hecho, todo el núcleo está compuesto por varios controladores de interrupciones y excepciones.

Para resumir:

En circunstancias normales, el procesador ejecuta el programa de usuario en el modo de usuario. En caso de una interrupción o excepción, el procesador cambia al modo privilegiado para ejecutar el programa del kernel. Después de procesar la interrupción o excepción, el procesador vuelve al modo modo de usuario para continuar ejecutando el programa de usuario.

falla de segmento

La falla de segmentación se genera de esta manera: el programa de usuario quiere acceder a una VA, pero la MMU verifica que no tiene derecho de acceso, la MMU genera una excepción, la CPU cambia del modo usuario al modo privilegiado y salta a el código del núcleo para ejecutar el programa de servicio de excepción. El núcleo interpreta esta excepción como un error de segmento y finaliza el proceso que envió la excepción.

Supongo que te gusta

Origin blog.csdn.net/hhhlizhao/article/details/131883073
Recomendado
Clasificación