Este artículo necesita citas adicionales para su verificación . ( febrero de 2018 ) |
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 . [1] Las direcciones de memoria son secuencias de dígitos de longitud fija que se muestran y manipulan convencionalmente como números enteros sin signo . Esta semántica numérica se basa en características de la CPU (como el puntero de instrucción y los registros de dirección incrementales ), así como en el uso de la memoria como una matriz aprobada por varios lenguajes de programación .
La memoria principal de una computadora digital consta de muchas ubicaciones de memoria . Cada ubicación de 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 (por ejemplo, los comprobadores de memoria ), direccionan la memoria física utilizando operandos de código de máquina o registros de procesador , lo que indica a la CPU que ordene a un dispositivo de hardware, llamado controlador de memoria , que use el bus de memoria o bus de 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 una serie de líneas paralelas , cada una representada por un dígito binario (bit). El ancho del bus y, por lo tanto, la cantidad de unidades de almacenamiento direccionables y la cantidad de bits en cada unidad, varía entre computadoras.
Un programa de computadora utiliza 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 se 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. En cambio, abordan 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 ; vea a continuación.
La mayoría de las computadoras modernas son direccionables por byte . Cada dirección identifica un solo byte ( ocho bits ) de almacenamiento. Los datos más grandes que un solo byte se pueden almacenar 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 por palabra de 18 bits , no direccionamiento por byte , lo que daba 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 usado para las direcciones: cuantos más bits se usen, más direcciones estarán disponibles para la computadora. Por ejemplo, una máquina direccionable por bytes 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 ) direcciona 2 32 (4.294.967.296) ubicaciones, o un espacio de direcciones de 4 GiB . En contraste, una máquina direccionable por palabras 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), equivalentes 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 mediante dígitos decimales . Por ejemplo, cada dirección en la memoria de núcleo magnético del IBM 1620 identificaba un solo dígito decimal codificado en binario de seis bits, que consistía en un bit de paridad , un 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 de las cuales admitía 20.000 direcciones, para un total de 60.000 (00000–59999).
El tamaño de palabra es una característica de la arquitectura informática que indica 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 un ordenador moderno, también se describe el tamaño del espacio de direcciones de ese ordenador. Por ejemplo, un ordenador que se dice que es de " 32 bits " también suele permitir direcciones de memoria de 32 bits; un ordenador de 32 bits direccionable por bytes puede direccionar 2 32 = 4.294.967.296 bytes de memoria, o 4 gibibytes (GiB). Esto permite almacenar de forma eficiente una dirección de memoria 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 su tamaño de palabra. Por ejemplo, muchos procesadores de 8 bits , como el MOS Technology 6502 , admitían direcciones de 16 bits ; de lo contrario, habrían estado limitados a solo 256 bytes de direccionamiento de memoria. Los Intel 8088 e Intel 8086 de 16 bits admitían direccionamiento de 20 bits mediante segmentación , lo que les permitía acceder a 1 MiB en lugar de 64 KiB de memoria. Todos los procesadores Intel Pentium desde el 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. Muchas de las primeras implementaciones de LISP en, por ejemplo, procesadores de 36 bits , tenían 2 direcciones por palabra . Algunos procesadores tempranos tenían 2 e incluso 3 direcciones por palabra de instrucción.
En teoría, las computadoras modernas direccionables por bytes de 64 bits pueden direccionar 264 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, número de conectores de memoria física o cantidad de memoria soldada).
Cada posición de memoria de una computadora con programa almacenado contiene un número binario o decimal de algún tipo . Su interpretación, como datos de algún tipo o como instrucción, y su uso están determinados por las instrucciones que los recuperan y manipulan.
Algunos de los primeros programadores combinaban 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 fragmentos de datos (su procesador ignoraba una pequeña sección en medio de una palabra) y eso a menudo se explotaba como almacenamiento de datos adicional. [ cita requerida ] Los programas autorreplicantes, como los virus, se tratan a sí mismos a veces como datos y a veces como instrucciones. El código automodificable generalmente está en desuso hoy en día, ya que dificulta desproporcionadamente las pruebas y el mantenimiento al ahorrar unos pocos bytes, y también puede dar resultados incorrectos debido a las suposiciones del compilador o del procesador sobre el estado de la máquina , pero todavía se usa a veces deliberadamente, con mucho cuidado.
En un entorno multitarea moderno , un proceso de aplicación generalmente tiene en su espacio (o espacios) de direcciones fragmentos 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" en la que el código de 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 máquina y las constantes en la memoria Flash, y registros de dirección de 12 bits para direccionar los datos en la memoria SRAM.
Un programa de computadora puede acceder a una dirección dada explícitamente; en programación de bajo nivel, esto generalmente se denominaDirección absoluta , o a veces una dirección específica, y se conoce comopunteroen 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ásmodos de direccionamiento.
La asignación de direcciones lógicas a la memoria física y virtual también agrega varios niveles de indirección; consulte a continuación.
Muchos programadores prefieren direccionar la memoria de tal manera que no haya distinción entre el espacio de código y el espacio de datos (ver arriba), así como entre la memoria física y la virtual (ver arriba); 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 con arquitectura Harvard obligan a que el almacenamiento de programas esté 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 recuperan de las tres áreas simultáneamente; menos áreas de almacenamiento (incluso si hubiera la misma cantidad total de bytes de almacenamiento) harían que esas instrucciones se ejecutaran más lentamente.
Los primeros procesadores x86 utilizan el modelo de memoria segmentada, cuyas direcciones se basan 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 los desplazamientos son variables.
En los sistemas 360/65 y 360/67 , IBM introdujo un concepto conocido como prefijo. [2] El prefijo es un nivel de traducción de direcciones que se aplica a direcciones en modo real y a direcciones generadas por traducción dinámica de direcciones, utilizando un prefijo único asignado a cada CPU. En los sistemas 360/65, 360/67 y todos los sucesores anteriores a z/Architecture , intercambia lógicamente un bloque de almacenamiento de 4096 bytes con otro bloque asignado a la CPU. En z/Architecture, [3] el prefijo opera en bloques de 8196 bytes. IBM clasifica las direcciones en estos sistemas como: [4]
En los modelos 360/65, S/370 sin DAT y cuando se ejecuta con la traducción desactivada, solo hay un espacio de dirección real plano y un espacio de dirección absoluta plano.
En los modelos 360/67, S/370 y sucesores hasta S/390 , cuando se ejecutan con la traducción activada, las direcciones contienen un número de segmento, un número de página y un desplazamiento. Aunque los primeros modelos admitían tamaños de página de 2 y 4 KiB, los modelos posteriores solo admitían 4 KiB. Posteriormente, IBM agregó instrucciones para mover datos entre un espacio de direcciones principal y un espacio de direcciones secundario.
S/370-XA Se agregaron direcciones de 31 bits, pero se conservó la jerarquía de segmento/página/desplazamiento con páginas de 4 KiB.
ESA/370 agregó 16 registros de acceso (AR) y un modo de control de acceso AR, en el que se tradujo una dirección de 31 bits utilizando el espacio de dirección designado por un AR seleccionado.
z/Architecture admite direcciones virtuales, reales y absolutas de 64 bits, con tablas de páginas de varios niveles.
El procedimiento de reubicación se aplica a los primeros 4096 bytes de almacenamiento. Esta área contiene todas las asignaciones de almacenamiento permanente y, en general, tiene un significado especial para los programas de supervisión. La reubicación se logra insertando un prefijo de 12 bits en cada dirección que tiene los 12 bits de orden superior establecidos en cero y, por lo tanto, pertenece a la ubicación 0-4095.
La prefijación proporciona la capacidad de asignar el bloque de direcciones reales que contiene ubicaciones de almacenamiento asignadas a un bloque diferente en el almacenamiento absoluto para cada CPU, lo que permite que más de una CPU que comparte el almacenamiento principal funcione simultáneamente con un mínimo de interferencia, especialmente en el procesamiento de interrupciones.