
En informática , una dirección de memoria es una referencia a una ubicación específica de memoria utilizada tanto por el software como por el hardware . [ 1 ] Estas direcciones son secuencias de dígitos de longitud fija , que normalmente se muestran y manejan como enteros sin signo . Esta representación numérica se basa en las características de la CPU (como el puntero de instrucciones y los registros de direcciones incrementales ). Las construcciones de los lenguajes de programación suelen tratar la memoria como una matriz.
Tipos
Direcciones físicas
La memoria principal de un ordenador digital consta de numerosas ubicaciones de memoria , cada una identificada por una dirección física única (un código específico). La CPU u otros dispositivos pueden utilizar estos códigos para acceder a las ubicaciones de memoria correspondientes. Generalmente, solo el software del sistema (como la BIOS , los sistemas operativos y programas de utilidad especializados, como los comprobadores de memoria ) accede directamente a la memoria física mediante instrucciones de código máquina o registros del procesador. Estas instrucciones indican a la CPU que interactúe con un componente de hardware denominado controlador de memoria. El controlador de memoria gestiona el acceso a la memoria mediante el bus de memoria o un bus del sistema, o a través de buses de control, direcciones y datos independientes , para ejecutar los comandos del programa. El bus gestionado por el controlador de memoria consta de múltiples líneas paralelas, cada una de las cuales representa un dígito binario (bit).
Direcciones lógicas
Un programa informático utiliza direcciones de memoria para ejecutar código máquina y para almacenar y recuperar datos . En los primeros ordenadores, las direcciones lógicas (utilizadas por los programas) y las direcciones físicas (ubicaciones reales en la memoria del hardware) eran iguales. Sin embargo, con la introducción de la memoria virtual , la mayoría de los programas de aplicación no trabajan directamente con direcciones físicas. En su lugar, utilizan direcciones lógicas o virtuales , que la unidad de gestión de memoria (MMU) del ordenador y los mecanismos de asignación de memoria del sistema operativo traducen a direcciones físicas .
Unidad de resolución de direcciones
La mayoría de las computadoras modernas son direccionables por byte . Cada dirección identifica un único byte de 8 bits ( octeto ) de almacenamiento. Los datos de mayor tamaño que un byte pueden almacenarse en una secuencia de direcciones consecutivas. Existen computadoras direccionables por palabra , donde la unidad mínima de almacenamiento direccionable es precisamente la palabra del procesador . [ a ] Por ejemplo, el miniordenador Data General Nova y los microordenadores Texas Instruments TMS9900 y National Semiconductor IMP-16 usaban palabras de 16 bits , y hay muchos ordenadores centrales antiguos que usan direccionamiento de palabras de 36 bits (como el IBM 7090 , con direcciones de palabras de 15 bits, lo que da un espacio de direcciones de 2 15 palabras de 36 bits, aproximadamente 128 kilobytes de almacenamiento, y el DEC PDP-6 / PDP-10 , con direcciones de palabras de 18 bits, lo que da un espacio de direcciones de 2 18 palabras de 36 bits, aproximadamente 1 megabyte de almacenamiento), no direccionamiento por byte. El rango de 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 el ordenador. Por ejemplo, una máquina direccionable por byte de 8 bits con un bus de direcciones de 20 bits (por ejemplo, Intel 8086 ) puede direccionar 2²⁰ (1.048.576) ubicaciones de memoria, o un MiB de memoria, mientras que un bus de 32 bits (por ejemplo, Intel 80386 ) direcciona 2³² (4.294.967.296) ubicaciones, o un espacio de direcciones de 4 GiB . En contraste, una máquina direccionable por palabra de 36 bits con un bus de direcciones de 18 bits direcciona solo 2¹⁸ ( 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.
Un pequeño número de máquinas antiguas son direccionables por bits . Por ejemplo, una instrucción de longitud de campo variable (VFL, por sus siglas en inglés) en el IBM 7030 "Stretch" especifica una dirección de bit, un tamaño de byte de 1 a 8 y una longitud de campo.
Algunos ordenadores antiguos ( ordenadores decimales ) son direccionables mediante dígitos decimales . Por ejemplo, cada dirección en la memoria de núcleo magnético del IBM 1620 identificaba un único dígito decimal codificado en binario de seis bits , compuesto por un bit de paridad , un bit de bandera y cuatro bits numéricos. [ 2 ] El 1620 utilizaba 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 añadir hasta dos unidades de memoria externa opcionales, cada una con capacidad para 20.000 direcciones, para un total de 60.000 (00000–59999).
Algunos ordenadores antiguos son direccionables por caracteres, con caracteres BCD de 6 bits que contienen una zona de 2 bits y un dígito de 4 bits; los caracteres de una dirección solo tienen valores de dígito que representan del 0 al 9. Normalmente, algunos de los bits de la zona forman parte de la dirección y otros se utilizan para otros fines, por ejemplo, registro de índice, dirección indirecta. [ 3 ]
Algunos ordenadores antiguos son direccionables por palabras decimales, normalmente con direcciones de 4 dígitos. [ 4 ] En algunas máquinas, los campos de dirección también seleccionan registros de índice, lo que restringe el rango de direcciones posibles. [ 5 ]
Tamaño de palabra versus tamaño de dirección
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 simultáneamente. Los procesadores modernos, incluidos los sistemas embebidos , suelen tener un tamaño de palabra de 8, 16, 24, 32 o 64 bits; la mayoría de los ordenadores actuales de propósito general utilizan 32 o 64 bits. Históricamente se han utilizado muchos tamaños diferentes, como 8, 9, 10, 12, 18, 24, 36, 39, 40, 48 y 60 bits.
Con frecuencia, al referirse al tamaño de palabra de una computadora moderna, también se describe el tamaño del espacio de direcciones de esa computadora. Por ejemplo, una computadora de " 32 bits " generalmente también permite direcciones de memoria de 32 bits; una computadora de 32 bits direccionable por byte puede direccionar 2³² = 4.294.967.296 bytes de memoria, o 4 gibibytes (GiB). Esto permite almacenar una dirección de memoria de manera eficiente en una palabra.
Sin embargo, esto no siempre es cierto. Las computadoras pueden tener direcciones de memoria mayores o menores 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 no ser así, se habrían limitado a tan solo 256 bytes de direccionamiento de memoria. Los procesadores 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 el mapeo de direcciones físicas de 36 bits a direcciones virtuales de 32 bits. Muchas implementaciones tempranas de LISP en, por ejemplo, procesadores de 36 bits , mantenían 2 direcciones por palabra como resultado de una cons . Algunos procesadores tempranos mantenían 2 e incluso 3 direcciones por palabra de instrucción.
En teoría, los ordenadores modernos de 64 bits con direccionamiento por bytes pueden direccionar 2⁶⁴ 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 físicos o la cantidad de memoria soldada).
Contenido de cada ubicación de memoria
En un ordenador con programa almacenado, cada ubicación de memoria contiene un número binario o decimal . Su interpretación, ya sea como dato de algún tipo o como instrucción, y su uso vienen determinados por las instrucciones que lo recuperan y manipulan.
Algunos programadores pioneros combinaban instrucciones y datos en palabras para ahorrar memoria, cuando esta era costosa: 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), lo que a menudo se aprovechaba como almacenamiento de datos adicional. Los programas autorreplicantes , como los virus, a veces se tratan a sí mismos como datos y otras veces como instrucciones. El código automodificable generalmente se desaconseja hoy en día, ya que dificulta desproporcionadamente las pruebas y el mantenimiento en comparación con el ahorro de 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 aún se usa a veces deliberadamente, con mucho cuidado.
Espacio de direcciones en la programación de aplicaciones
En un entorno multitarea moderno , un proceso de aplicación suele tener en su espacio (o espacios) de direcciones bloques de memoria de los siguientes tipos:
- Código máquina , incluyendo:
- el código propio del programa (históricamente conocido como segmento de código o segmento de texto );
- bibliotecas compartidas .
- Datos , incluyendo:
- datos inicializados ( segmento de datos );
- variables no inicializadas (pero asignadas) ;
- pila de ejecución ;
- montón ;
- Memoria compartida y archivos mapeados en memoria .
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 máquina, las constantes y los datos se encuentran en ubicaciones diferentes y pueden tener tamaños de dirección distintos. Por ejemplo, los microcontroladores PIC18 tienen un contador de programa de 21 bits para direccionar el código máquina y las constantes en la memoria Flash, y registros de direcciones de 12 bits para direccionar los datos en la memoria SRAM.
Esquemas de direccionamiento
Un programa informático puede acceder a una dirección dada explícitamente; en la programación de bajo nivel, esto se suele llamarLa dirección absoluta , o a veces una dirección específica, se conoce comopunteroen lenguajes de alto nivel. Pero un programa también puede usaruna dirección relativa, que especifica una ubicación en relación con otra (la dirección base ). Existen muchos másmodos de direccionamiento.
La asignación de direcciones lógicas a la memoria física y virtual también añade varios niveles de indirección; véase más abajo.
Modelos de memoria
Muchos programadores prefieren direccionar la memoria de forma que no haya distinción entre el espacio de código y el espacio de datos (véase más arriba ), así como entre la memoria física y la virtual (véase más arriba ); en otras palabras, los punteros numéricamente idénticos se refieren exactamente al mismo byte de RAM.
Sin embargo, muchos de los primeros ordenadores no admitían un modelo de memoria tan plano ; en particular, las máquinas con arquitectura Harvard obligaban a que el almacenamiento de programas estuviera 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 acceden a las tres áreas simultáneamente; un menor número de áreas de almacenamiento (incluso con la misma cantidad total de bytes) ralentizaría la ejecución de dichas instrucciones.
Modelos de memoria en la arquitectura x86
Los primeros procesadores x86 utilizaban direcciones de memoria segmentadas 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 sus usos son diferentes, los segmentos no cuentan con protecciones de memoria distintas que reflejen esta diferencia. En el modelo de memoria plana, todos los segmentos (registros de segmento) generalmente se establecen a cero, y solo los desplazamientos son variables.
Modelos de memoria en los multiprocesadores IBM S/360 y sus sucesores
En los sistemas 360/65 y 360/67 , IBM introdujo un concepto conocido como prefijo. [ 6 ] El prefijo es un nivel de traducción de direcciones que se aplica a las direcciones en modo real y a las direcciones generadas por la traducción dinámica de direcciones, utilizando un prefijo único asignado a cada CPU en un sistema multiprocesador. 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, [ 7 ] el prefijo opera en bloques de 8196 bytes. IBM clasifica las direcciones en estos sistemas como: [ 8 ]
- Direcciones virtuales: direcciones sujetas a traducción dinámica de direcciones.
- Direcciones reales: direcciones generadas a partir de la traducción dinámica de direcciones y direcciones utilizadas por el código que se ejecuta en modo real.
- Direcciones absolutas: direcciones físicas
En los modelos 360/65, en los modelos S/370 sin DAT y cuando se ejecutan con la traducción desactivada, solo hay un espacio de direcciones real plano y un espacio de direcciones absoluto plano.
En los procesadores 360/67, S/370 y sus sucesores hasta el 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. Si bien los primeros modelos admitían tamaños de página de 2 KiB y 4 KiB, los modelos posteriores solo admitían 4 KiB. Posteriormente, IBM añadió instrucciones para transferir datos entre un espacio de direcciones primario y un espacio de direcciones secundario.
El S/370-XA añadió direcciones de 31 bits, pero mantuvo la jerarquía segmento/página/desplazamiento con páginas de 4 KiB.
ESA/370 añadió 16 registros de acceso (AR) y un modo de control de acceso a AR, en el que una dirección de 31 bits se traducía utilizando el espacio de direcciones designado por un AR seleccionado.
La arquitectura z admite direcciones virtuales, reales y absolutas de 64 bits, con tablas de páginas multinivel.
Véase también
- Dirección base
- Endianidad
- Modelo de memoria plana
- Lenguaje de programación de bajo nivel
- Registro de direcciones de memoria
- Asignación de memoria
- Unidad de gestión de memoria (MMU)
- Modelo de memoria (programación)
- Protección de memoria
- Segmentación de memoria
- Offset (informática) , también conocido como desplazamiento
- Tabla de páginas
Notas
- ↑ Algunas computadoras direccionables por palabra tienen instrucciones de manejo de bytes, que normalmente admiten tamaños de bytes de hasta una palabra, pero no admiten bytes que se extienden entre palabras. Por ejemplo, las DEC PDP-6 y PDP-10 tienen
- Byte de depósito (DPB)
- Incrementar puntero de byte (IBP)
- Byte de incremento y depósito (IDPB)
- Incremento y carga de bytes (ILDB)
- Byte de carga (LDB)
Referencias
- ↑ Abrahamson, Karl R. (20 de agosto de 2022). "5.10.1. La memoria y las direcciones de la memoria" . Universidad de East Carolina . Recuperado el 3 de febrero de 2023 .
- ↑ Unidad central de procesamiento IBM 1620, modelo 1 (PDF) . Biblioteca de referencia de sistemas. IBM . A26-5706-3 . Consultado el 7 de marzo de 2025 .
- ↑ Manual de referencia del sistema - RCA 3301 (PDF) . RCA EDP. Septiembre de 1967. 94-16-000 . Consultado el 7 de marzo de 2025 .
- ↑ Principios de funcionamiento de IBM 7070-7074 (PDF) . Biblioteca de referencia de sistemas. IBM . GA22-7003-6 . Consultado el 7 de marzo de 2025 .
- ↑ 650 máquina de procesamiento de datos de tambor magnético - manual de operación (PDF) . IBM 22-6060-2. Junio de 1955. 22-6060-2 . Consultado el 7 de marzo de 2025 .
- ↑ "Operación multisistema" (PDF) . Principios de operación del IBM System/360 (PDF) . Biblioteca de referencia de sistemas (octava ed.). Septiembre de 1968. pág. 18. A22-6821-7 . Recuperado el 21 de julio de 2024. El
procedimiento de reubicación se aplica a los primeros 4096 bytes de almacenamiento. Esta área contiene todas las asignaciones de almacenamiento permanente y, generalmente, tiene una importancia especial para los programas de supervisión. La reubicación se realiza insertando un prefijo de 12 bits en cada dirección, cuyos 12 bits de orden superior se establecen en cero y, por lo tanto, se refiere a la ubicación 0-4095.
- ↑ "Prefijo en el modo arquitectónico de z/Architecture" (PDF) . Principios de funcionamiento de z/Architecture (PDF) (Decimocuarta edición). Mayo de 2022. págs. 3-21–3-23. SA22-7832-13 . Consultado el 21 de julio de 2024.
El prefijo permite 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 opere simultáneamente con una mínima interferencia, especialmente en el procesamiento de interrupciones.
- ↑ "Tipos de direcciones" (PDF) . Principios de funcionamiento de z/Architecture (PDF) (Decimocuarta edición). Mayo de 2022. págs. 3-4 – 3-5 . SA22-7832-13 . Consultado el 21 de julio de 2024 .
- Memoria de computadora