Los programas y los datos se almacenan como números en las celdas de la memoria. Cada celda de memoria tiene un número único, llamado , dirección. El rango de números que representan direcciones válidas se llama espacio de direcciones.
Cuando se ejecutan programas, la CPU lee datos de la memoria y vuelve a escribir los resultados en la memoria. La CPU comunica la ubicación deseada a la memoria especificando la dirección de la celda de memoria seleccionada por una operación de lectura o escritura.
Hay varias maneras en que la CPU puede encontrar una dirección (recuerde, la dirección es solo un número). El número que representa la dirección podría estar en un registro, podría almacenarse en otra ubicación de la memoria, podría calcularse sumando o restando un desplazamiento a un registro, y así sucesivamente. En todos los casos, su programa compilado instruye a la CPU sobre cómo generar (o generar) la dirección que necesita para leer o escribir.
Las arquitecturas modernas permiten que múltiples programas se ejecuten como si fueran propietarios de todo el espacio de direcciones lógicas. En otras palabras, varios programas podrían escribir en la ubicación de la memoria en la misma dirección sin pasar por encima de los resultados de los demás. Esto se hace virtualizando el espacio de direcciones: digamos que los programas A y B generan una ubicación de escritura en memoria en 0x1000. La CPU, con la ayuda del sistema operativo, podría realizar ajustes adicionales a la dirección y map a dirección física 0x60001000 para el programa A, y a 0x5F001000 para el programa B. Ambos programas creen que escribieron en la ubicación en 0x1000 , porque operan en un espacio de direcciones virtual. Su modelo de memoria es un bloque contiguo que comienza en 0 y continúa en 0x000100000000 (suponiendo que su sistema tenga 4GiB de memoria disponible para los procesos). Pero este modelo solo funciona porque la CPU adicionalmente traduce sus direcciones lógicas a direcciones físicas, que se asignan y quitan según sea necesario en el proceso de ejecución del programa.
Debido a que el mismo número que representa una dirección significa cosas diferentes para un programa y a una CPU, el espacio de direcciones del programa se llama virtual, y el espacio de direcciones de la CPU se llama física.
En su ejemplo 0x1000 es una dirección generada por programa? –
@ program-o-steve Sí, es una dirección generada por el programa.Tenga en cuenta que no importa * cómo * el programa generó esa dirección: podría ser una dirección de una variable estática, un elemento 0 de una matriz en la dirección 0x1000, un elemento 32 de una matriz en la dirección 0x0FE0, etc. . – dasblinkenlight
pero la declaración en mi pregunta dice que la dirección generada por el programa es una dirección virtual. 0x1000 no parece ser una dirección virtual –