Saltar al contenido

Diferencia entre dirección de memoria física / lógica / virtual

Solución:

Mi respuesta es cierta para las CPU Intel que se ejecutan en un sistema Linux moderno, y estoy hablando de procesos a nivel de usuario, no de código del kernel. Aún así, creo que le dará una idea suficiente para pensar en las otras posibilidades

Tipos de direcciones

Respecto a la pregunta 3:

Me he encontrado con la discusión de que las direcciones / espacios de direcciones virtuales y lógicos son lo mismo. ¿Es verdad?

Hasta donde yo sé, son iguales, al menos en los sistemas operativos modernos que se ejecutan sobre procesadores Intel.

Permítanme intentar definir dos nociones antes de explicar más:

  • Dirección física: La dirección de la ubicación física de algo en el chip RAM.
  • Dirección lógica / virtual: La dirección que utiliza su programa para llegar a sus cosas. Por lo general, se convierte a una dirección física más tarde mediante un chip de hardware (en su mayoría, ni siquiera la CPU es consciente de esta conversión).

Dirección virtual / lógica

La dirección virtual está bien, una dirección virtual, el sistema operativo junto con un circuito de hardware llamado MMU (Unidad de administración de memoria) engañan a su programa de que se está ejecutando solo en el sistema, tiene todo el espacio de direcciones (tener un sistema de 32 bits significa que su programa pensará que tiene 4 GB de RAM; en términos generales).

Obviamente, si tiene más de un programa ejecutándose al mismo tiempo (siempre lo hace, GUI, proceso de inicio, Shell, aplicación de reloj, calendario, lo que sea), esto no funcionará.

Lo que sucederá es que el SO colocará la mayor parte de la memoria de tu programa en el disco duro, las partes que más use estarán presentes en la RAM, pero bueno, eso no significa que tendrán la dirección tuya y tu programa saber.

Ejemplo: Su proceso puede tener una variable llamada (contador) a la que se le ha dado la dirección virtual 0xff (imaginariamente …) y otra variable llamada (a menudoNotUsed) a la que se le ha dado la dirección virtual (0xaa).

Si lee el ensamblaje de su código compilado después de que ocurrieron todos los enlaces, accederá a ellos usando esas direcciones, pero bueno, la variable (a menudoNotUsed) no estará realmente allí en la RAM en 0xaa, estará en el disco duro porque el proceso no lo está utilizando.

Además, la variable (contador) probablemente no estará físicamente en (0xff), estará en otro lugar de la RAM, cuando su CPU intente recuperar lo que está en 0xff, la MMU y una parte del sistema operativo, harán un mapeo y obtener esa variable de donde está realmente disponible en la RAM, la CPU ni siquiera notará que no estaba en 0xff.

Ahora, ¿qué sucede si su programa solicita la variable (a menudoNotUsed)? El sistema operativo MMU + notará este ‘error’ y lo buscará para la CPU desde el disco duro a la RAM y luego lo entregará a la CPU como si estuviera en la dirección (0xaa); esta búsqueda significa que algunos datos que estaban presentes en la RAM se enviarán de vuelta al disco duro.

Ahora imagine que esto se ejecuta para todos los procesos de su sistema. Cada proceso piensa que tiene 4GB de RAM, nadie realmente tiene eso, pero todo funciona porque todos tienen algunas partes de su programa disponibles físicamente en la RAM, pero la mayor parte del programa reside en el disco duro. No confunda esta parte de la memoria del programa que se coloca en HD con los datos del programa a los que puede acceder a través de operaciones de archivo.

Resumen

Dirección virtual: La dirección que usa en sus programas, la dirección que usa su CPU para obtener datos, no es real y se traduce a través de MMU a alguna dirección física; todo el mundo tiene uno y su tamaño depende de su sistema (Linux con 32 bits tiene un espacio de direcciones de 4 GB)

Dirección física: La dirección a la que nunca llegará si está ejecutando sobre un sistema operativo. Es donde sus datos, independientemente de su dirección virtual, residen en la RAM. Esto cambiará si sus datos se envían de ida y vuelta al disco duro para acomodar más espacio para otros procesos.

Todo lo que he mencionado anteriormente, aunque es una versión simplificada de todo el concepto, es lo que se llama la parte de administración de memoria del sistema informático.

Consecuencias de este sistema

  • Los procesos no pueden acceder entre sí a la memoria, todos tienen sus direcciones virtuales separadas y cada proceso obtiene una traducción diferente a diferentes áreas, aunque a veces puede buscar y encontrar que dos procesos intentan acceder a la misma dirección virtual.
  • Este sistema funciona bien como sistema de almacenamiento en caché, por lo general no usa los 4 GB completos que tiene disponibles, entonces, ¿por qué desperdiciar eso? deje que otros lo compartan y que ellos también lo usen; cuando su proceso necesita más, el sistema operativo buscará sus datos del disco duro y reemplazará los datos de otros procesos, a un costo por supuesto.

Dirección física: cuando el procesador está en modo de sistema, la dirección utilizada por el procesador es la dirección física.

No es necesariamente cierto. Depende de la CPU en particular. En las CPU x86, una vez que ha habilitado la traducción de páginas, todo el código deja de operar con direcciones físicas o direcciones trivialmente convertibles en direcciones físicas (excepto, SMM, AFAIK, pero eso no es importante aquí).

Dirección lógica: cuando el procesador está en modo de usuario, la dirección utilizada es la dirección lógica. de todos modos, estos se asignan a alguna dirección física agregando un registro base con el valor de compensación.

Las direcciones lógicas no se aplican necesariamente al modo de usuario exclusivamente. En las CPU x86 también existen en modo kernel.

Me he encontrado con la discusión de que las direcciones / espacios de direcciones virtuales y lógicos son lo mismo. ¿Es verdad?

Depende de la CPU en particular. Las CPU x86 se pueden configurar de tal manera que los segmentos no se utilicen explícitamente. Se usan implícitamente y sus bases son siempre 0 (excepto para los segmentos de almacenamiento local de subprocesos). Lo que queda cuando quita el selector de segmento de una dirección lógica es un desplazamiento de 32 bits (o 64 bits) cuyo valor coincide con la dirección virtual de 32 bits (o 64 bits). En esta configuración simplificada, puede considerar que los dos son iguales o que las direcciones lógicas no existen. No es cierto, pero para la mayoría de los propósitos prácticos, es una aproximación bastante buena.

Me refiero a la siguiente base de respuestas en la CPU intel x86

Diferencia entre dirección lógica y virtual

Siempre que su programa está en ejecución, la CPU genera una dirección lógica para las instrucciones que contiene (selector de segmento de 16 bits y desplazamiento de 32 bits). Básicamente, la dirección virtual (dirección lineal) se genera utilizando campos de dirección lógica.

El selector de segmento es un campo de 16 bits, de los cuales los primeros 13 bits son un índice (que es un puntero al descriptor de segmento que reside en GDT, que se describe a continuación), campo TI de 1 bit (TI = 1, Referir LDT, TI = 0 Referir GDT)

Ahora el selector de segmento O digamos que el identificador de segmento se refiere al segmento de código O al segmento de datos O al segmento de pila, etc. segmento.

Entonces, para cada dirección lógica, la dirección virtual se calcula siguiendo los pasos a continuación.

1) Examina el campo TI del selector de segmento para determinar qué tabla de descriptor almacena el descriptor de segmento. Este campo indica que el Descriptor está en el GDT (en cuyo caso la unidad de segmentación obtiene la dirección lineal base del GDT del registro gdtr) o en el LDT activo (en cuyo caso la unidad de segmentación obtiene la dirección lineal base de ese LDT del registro ldtr).

2) Calcula la dirección del descriptor de segmento del campo de índice del selector de segmento. El campo de índice se multiplica por 8 (el tamaño de un descriptor de segmento) y el resultado se agrega al contenido del registro gdtr o ldtr.

3) Agrega el desplazamiento de la dirección lógica al campo Base del Descriptor de Segmento, obteniendo así la dirección lineal (Virtual).

Ahora es el trabajo de la unidad Pagging traducir la dirección física de la dirección virtual.

Consulte: Comprensión del kernel de Linux, Capítulo 2 Direccionamiento de memoria

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *