GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo sabe la CPU qué dirección física está asignada a qué dirección virtual?

La MMU accede a una tabla que describe cómo traducir direcciones virtuales a direcciones físicas. (No necesita traducir direcciones físicas a direcciones virtuales, y esto sería imposible en general, ya que se puede acceder a la misma dirección física a través de varias direcciones virtuales o se puede desmapear). El diseño de esta tabla depende de la arquitectura de la CPU, pero el principio general es siempre el mismo:hay un registro de CPU que contiene la dirección física de una tabla, que contiene las direcciones físicas de más tablas, y así sucesivamente (de 2 a 4 niveles en total en arquitecturas existentes) hasta un nivel de tablas que contiene las direcciones físicas donde se encuentran los datos. En cada nivel, qué elemento de la tabla usar está determinado por algunos de los bits en la dirección virtual.

La MMU no conoce los procesos del sistema operativo como tales. Cuando la CPU pasa a ejecutar un proceso diferente, es decir, cuando se produce un cambio de contexto, es tarea del código de cambio de contexto del sistema operativo actualizar las tablas de MMU según sea necesario. En la práctica, creo que todos los sistemas Unix mantienen una copia de las tablas en la memoria para cada proceso y simplemente actualizan el registro MMU para señalar la tabla de nivel superior para el proceso actual.

En realidad, hay una parte de la MMU que se preocupa por los procesos del sistema operativo:la TLB. Buscar entradas en la tabla MMU es bastante costoso ya que implica múltiples accesos a la memoria. El TLB es un caché de estas búsquedas. En un cambio de contexto, el sistema operativo debe invalidar el TLB (es decir, eliminar todas las entradas de caché), ya que la asignación será diferente para el nuevo proceso. Muchas arquitecturas permiten que el sistema operativo coloque un indicador en cada entrada de la tabla MMU para decir "esta entrada pertenece al proceso N". A continuación, se omite una entrada de TLB si el número de proceso que contiene no es el número de proceso actual. Un registro de la CPU contiene el número de proceso actual y el código de cambio de contexto lo actualiza. Este mecanismo significa que la TLB puede contener información sobre varios procesos a la vez, lo que mejora el rendimiento al alternar entre estos procesos. Debido a que a menudo hay menos bits disponibles para almacenar N que los necesarios para almacenar todos los ID de proceso del sistema operativo, N no es el ID de proceso, sino un número generado por el sistema operativo para este propósito y que cambia con el tiempo, si es que se usa.


En Linux, el kernel mantiene una tabla de páginas de tres niveles (independientemente de las capacidades de la CPU). El nivel superior es el directorio global de la página, y cada proceso tiene su propio directorio, pgd en mm_struct . Por lo tanto, cada proceso puede tener sus propias asignaciones, por lo que la dirección 12345 en diferentes procesos apunta a diferentes direcciones físicas.

Las CPU no son realmente conscientes de los procesos, pero tienden a tener características para respaldarlos. En las CPU de estilo x86, hay varias funciones relacionadas con tareas, pero en realidad tienden a ignorarse. Dado que la programación de procesos es administrada por el kernel, puede realizar un seguimiento de los cambios en la tabla de páginas y actualizar cualquier estado de la CPU que se requiera para cambiar a la tabla de páginas de un nuevo proceso cuando cambia de tarea. En las PC x86, eso implica actualizar el registro de control CR3 que apunta al directorio de la página.

El capítulo Administración de tablas de páginas en Comprender el administrador de memoria virtual de Linux de Mel Gorman libro ofrece una buena visión general.


Linux
  1. ¿Cómo funciona el comando Tee??

  2. ¿Cómo sabe el comando Xdg-open qué aplicación usar para abrir un archivo?

  3. ¿Cómo calcular el uso de CPU de un proceso por PID en Linux desde C?

  4. ¿Cómo funciona internamente copy_from_user del kernel de Linux?

  5. ¿Cómo funciona el comando ps?

Cómo encontrar la dirección IP de una máquina virtual KVM

Linux:¿cómo decide The Oom Killer qué proceso eliminar primero?

Linux:¿cómo se divide un espacio de direcciones virtuales de proceso de 64 bits en Linux?

Cómo usar el comando which en Linux

¿Qué es la tabla de procesos de Linux? ¿En qué consiste?

¿Cómo retiene Linux el control de la CPU en una máquina de un solo núcleo?