Dirección de memoria - Memory address

En una computadora que usa memoria virtual , acceder a la ubicación correspondiente a una dirección de memoria puede involucrar muchos niveles.

En informática , una dirección de memoria es una referencia a una ubicación de memoria específica utilizada en varios niveles por software y hardware . Las direcciones de memoria son secuencias de dígitos de longitud fija que se muestran y manipulan convencionalmente como enteros sin signo . Dicha semántica numérica se basa en las características de la CPU (como el puntero de instrucción y los registros de direcciones incrementales ), así como en el uso de la memoria como una matriz respaldada por varios lenguajes de programación .

Tipos

Direcciones físicas

Una computadora digital @ s de la memoria principal se compone de muchas posiciones de memoria . Cada ubicación de la memoria tiene una dirección física que es un código. La CPU (u otro dispositivo) puede usar el código para acceder a la ubicación de memoria correspondiente. Generalmente, solo el software del sistema , es decir, el BIOS , los sistemas operativos y algunos programas de utilidad especializados (p. Ej., Probadores de memoria ), se dirigen a la memoria física utilizando operandos de código de máquina o registros de procesador , indicando a la CPU que dirija un dispositivo de hardware, llamado controlador de memoria , a utilice el bus de memoria o el bus del sistema , o buses de control , dirección y datos separados , para ejecutar los comandos del programa. El bus de los controladores de memoria consta de varias líneas paralelas , cada una representada por un dígito binario (bit). El ancho del bus, y por lo tanto el número de unidades de almacenamiento direccionables y el número de bits en cada unidad, varía entre computadoras.

Direcciones lógicas

Un programa de computadora usa direcciones de memoria para ejecutar código de máquina y para almacenar y recuperar datos . En las primeras computadoras, las direcciones lógicas y físicas correspondían, pero desde la introducción de la memoria virtual, la mayoría de los programas de aplicación no tienen conocimiento de las direcciones físicas. Más bien, se dirigen a direcciones lógicas , o direcciones virtuales , utilizando la unidad de administración de memoria de la computadora y el mapeo de memoria del sistema operativo ; ver más abajo .

Unidad de resolución de direcciones

La mayoría de las computadoras modernas son direccionables por bytes . Cada dirección identifica un solo byte ( ocho bits ) de almacenamiento. Los datos de más de un byte pueden almacenarse en una secuencia de direcciones consecutivas. Existen computadoras direccionables por palabra , donde la unidad de almacenamiento direccionable mínima es exactamente la palabra del procesador . Por ejemplo, la minicomputadora Data General Nova y las microcomputadoras Texas Instruments TMS9900 y National Semiconductor IMP-16 usaban palabras de 16 bits , y había muchas computadoras mainframe de 36 bits (por ejemplo, PDP-10 ) que usaban direccionamiento de palabras de 18 bits , no direccionamiento de bytes , lo que da un espacio de direcciones de 2 18 palabras de 36 bits, aproximadamente 1 megabyte de almacenamiento. La eficiencia del direccionamiento de la memoria depende del tamaño de bits del bus utilizado para las direcciones: cuantos más bits se utilicen, más direcciones estarán disponibles para la computadora. Por ejemplo, una máquina direccionable de 8 bits con un bus de direcciones de 20 bits (por ejemplo, Intel 8086 ) puede direccionar 2 20 (1.048.576) ubicaciones de memoria, o un MiB de memoria, mientras que un bus de 32 bits (por ejemplo, Intel 80386) ) direcciones 2 32 (4,294,967,296) ubicaciones, o un espacio de direcciones de 4 GiB . Por el contrario, una máquina direccionable por palabra de 36 bits con un bus de direcciones de 18 bits direcciona solo 2 18 (262,144) ubicaciones de 36 bits (9,437,184 bits), equivalente a 1,179,648 bytes de 8 bits, o 1152 KiB , o 1,125 MiB - un poco más que el 8086.

Algunas computadoras más antiguas (computadoras decimales ) eran direccionables con dígitos decimales . Por ejemplo, cada dirección en el IBM 1620 's memoria de toros identificado una única de seis bits codificado en binario decimal dígitos, que consiste en un bit de paridad , bit de bandera y cuatro bits numéricos. El 1620 usaba direcciones decimales de 5 dígitos, por lo que, en teoría, la dirección más alta posible era 99,999. En la práctica, la CPU admitía 20.000 ubicaciones de memoria y se podían agregar hasta dos unidades de memoria externa opcionales, cada una con 20.000 direcciones, para un total de 60.000 (00000–59999).

Tamaño de palabra versus tamaño de dirección

El tamaño de la palabra es una característica de la arquitectura de la computadora que denota la cantidad de bits que una CPU puede procesar a la vez. Los procesadores modernos, incluidos los sistemas integrados , suelen tener un tamaño de palabra de 8, 16, 24, 32 o 64 bits; la mayoría de las computadoras de uso general actuales utilizan 32 o 64 bits. Históricamente se han utilizado muchos tamaños diferentes, incluidos 8, 9, 10, 12, 18, 24, 36, 39, 40, 48 y 60 bits.

Muy a menudo, cuando se hace referencia al tamaño de palabra de una computadora moderna, también se describe el tamaño del espacio de direcciones en esa computadora. Por ejemplo, una computadora que se dice que es de " 32 bits " también suele permitir direcciones de memoria de 32 bits; una computadora de 32 bits direccionable por bytes puede direccionar 2 32 = 4,294,967,296 bytes de memoria, o 4 gibibytes (GiB). Esto permite que una dirección de memoria se almacene de manera eficiente en una palabra.

Sin embargo, esto no siempre es cierto. Las computadoras pueden tener direcciones de memoria más grandes o más pequeñas que el tamaño de su palabra. Por ejemplo, muchos procesadores de 8 bits , como MOS Technology 6502 , admitían direcciones de 16 bits ; de lo contrario, se habrían limitado a solo 256 bytes de direccionamiento de memoria. Los procesadores Intel 8088 e Intel 8086 de 16 bits admitían el direccionamiento de 20 bits a través de la segmentación , lo que les permitía acceder a 1 MiB en lugar de 64 KiB de memoria. Todos los procesadores Intel Pentium desde Pentium Pro incluyen extensiones de dirección física (PAE) que admiten la asignación de direcciones físicas de 36 bits a direcciones virtuales de 32 bits. Muchos de los primeros procesadores tenían 2 direcciones por palabra , como los procesadores de 36 bits .

En teoría, las computadoras modernas de 64 bits direccionables por bytes pueden direccionar 2 64 bytes (16 exbibytes ), pero en la práctica la cantidad de memoria está limitada por la CPU, el controlador de memoria o el diseño de la placa de circuito impreso (por ejemplo, el número de conectores de memoria o cantidad de memoria soldada).

Contenido de cada ubicación de la memoria

Cada ubicación de la memoria en una computadora con programa almacenado contiene un número binario o un número decimal de algún tipo . Su interpretación, como dato de algún tipo de dato o como instrucción, y su uso están determinados por las instrucciones que los recuperan y manipulan.

Algunos de los primeros programadores combinaron instrucciones y datos en palabras como una forma de ahorrar memoria, cuando era caro: el Manchester Mark 1 tenía espacio en sus palabras de 40 bits para almacenar pequeños bits de datos; su procesador ignoró una pequeña sección en el medio de una palabra, y eso a menudo se explotaba como almacenamiento adicional de datos. Los programas de autorreplicación , como los virus, se tratan a sí mismos a veces como datos y, a veces, como instrucciones. El código de modificación automática generalmente está desaprobado hoy en día, ya que hace que las pruebas y el mantenimiento sean desproporcionadamente difíciles para el ahorro de unos pocos bytes, y también puede dar resultados incorrectos debido a las suposiciones del compilador o procesador sobre el estado de la máquina , pero a veces todavía se usa deliberadamente. con gran cuidado.

Espacio de direcciones en la programación de aplicaciones

En el entorno moderno de multitarea , un proceso de aplicación generalmente tiene en su espacio de direcciones (o espacios) trozos de memoria de los siguientes tipos:

Es posible que algunas partes del espacio de direcciones no estén asignadas en absoluto.

Algunos sistemas tienen una arquitectura de memoria "dividida" donde el código de la máquina, las constantes y los datos se encuentran en diferentes ubicaciones y pueden tener diferentes tamaños de dirección. Por ejemplo, los microcontroladores PIC18 tienen un contador de programa de 21 bits para direccionar el código de la máquina y las constantes en la memoria Flash, y registros de dirección de 12 bits para direccionar los datos en SRAM.

Abordar esquemas

Un programa de computadora puede acceder a una dirección dada explícitamente ; en la programación de bajo nivel, esto generalmente se llama dirección absoluta , o en ocasiones unadirección específica, y se conoce comotipo de datos depunteroen lenguajes de nivel superior. Pero un programa también puede usaruna dirección relativaque especifica una ubicación en relación con otro lugar (la dirección base ). Hay muchos más modos de direccionamiento indirecto .

La asignación de direcciones lógicas a la memoria física y virtual también agrega varios niveles de direccionamiento indirecto; vea abajo.

Modelos de memoria

Muchos programadores prefieren direccionar la memoria de manera que no haya distinción entre el espacio de código y el espacio de datos (véase más arriba ), así como de la memoria física y virtual (ver más abajo ); en otras palabras, los punteros numéricamente idénticos se refieren exactamente al mismo byte. de RAM.

Sin embargo, muchas de las primeras computadoras no admitían un modelo de memoria tan plano ; en particular, las máquinas de la arquitectura de Harvard obligan al almacenamiento de programas a estar completamente separado del almacenamiento de datos. Muchos DSP modernos (como el Motorola 56000 ) tienen tres áreas de almacenamiento separadas: almacenamiento de programas, almacenamiento de coeficientes y almacenamiento de datos. Algunas instrucciones de uso común se obtienen de las tres áreas simultáneamente: menos áreas de almacenamiento (incluso si hubiera el mismo total de bytes de almacenamiento) haría que esas instrucciones se ejecutaran más lentamente.

Modelos de memoria en arquitectura x86

Las primeras computadoras x86 usan las direcciones del modelo de memoria segmentada basadas en una combinación de dos números: un segmento de memoria y un desplazamiento dentro de ese segmento.

Algunos segmentos se tratan implícitamente como segmentos de código , dedicados a instrucciones , segmentos de pila o segmentos de datos normales . Aunque los usos son diferentes, los segmentos no tienen diferentes protecciones de memoria que reflejen esto. En el modelo de memoria plana, todos los segmentos (registros de segmento) generalmente se establecen en cero y solo las compensaciones son variables.

Ver también

Referencias