stringtranslate.com

Dirección de memoria

En una computadora que usa memoria virtual , acceder a la ubicación correspondiente a una dirección de memoria puede implicar 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 el software y el 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 . Dicha semántica numérica se basa en 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

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, sólo el software del sistema , es decir, el BIOS , los sistemas operativos y algunos programas de utilidad especializados (por ejemplo, probadores de memoria ), direccionan 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 , para 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 tanto, el número de unidades de almacenamiento direccionables y el número de bits en cada unidad, varían entre computadoras.

Direcciones lógicas

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 correspondían, pero desde la introducción de la memoria virtual la mayoría de los programas de aplicación no conocen las direcciones físicas. Más bien, 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 abajo.

Unidad de resolución de direcciones

La mayoría de las computadoras modernas son direccionables por bytes . Cada dirección identifica un único byte ( ocho bits ) de almacenamiento. Los datos de más de un byte se pueden almacenar en una secuencia de direcciones consecutivas. Existen computadoras direccionables por palabra , donde la unidad mínima de almacenamiento direccionable 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 centrales de 36 bits (por ejemplo, PDP-10 ) que usaban direccionamiento de palabras de 18 bits . no direccionamiento de bytes , lo que proporciona un espacio de direcciones de 2 x 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 220 ( 1,048,576) ubicaciones de memoria, o un MiB de memoria, mientras que un bus de 32 bits (por ejemplo, Intel 80386 ) aborda 2 32 (4,294,967,296) ubicaciones, o un espacio de direcciones de 4 GiB . Por el contrario, una máquina direccionable por palabras de 36 bits con un bus de direcciones de 18 bits solo dirige 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 la memoria de núcleo magnético del IBM 1620 identificaba un único dígito decimal codificado en binario de seis bits, que constaba de 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).

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

El tamaño de palabra es una característica de la arquitectura de la computadora que indica la cantidad de bits que una CPU puede procesar al mismo tiempo. 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 nos referimos al tamaño de las palabras 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 almacenar eficientemente una dirección de memoria en una palabra.

Sin embargo, esto no siempre es cierto. Las computadoras pueden tener direcciones de memoria mayores o menores que el tamaño de sus palabras. Por ejemplo, muchos procesadores de 8 bits , como el MOS Technology 6502 , admitían direcciones de 16 bits ; de lo contrario, se habrían limitado a tan 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 direcciones físicas (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 x 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 unidades físicas). conectores de memoria o cantidad de memoria soldada).

Contenido de cada ubicación de memoria.

Cada ubicación de memoria en una computadora con programa almacenado contiene un número binario o decimal de algún tipo . Su interpretación, como dato de algún tipo de datos 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 necesaria ] Los programas autorreplicantes , como los virus, se tratan a sí mismos a veces como datos y otras veces como instrucciones. El código de modificación automática generalmente está en desuso 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 veces todavía se usa deliberadamente. con gran cuidado.

Espacio de direcciones en la programación de aplicaciones.

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" donde el código de máquina, las constantes y los datos se encuentran en diferentes ubicaciones y pueden tener diferentes tamaños de direcciones. 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 direcciones de 12 bits para direccionar los datos en SRAM.

Esquemas de direccionamiento

Un programa de computadora puede acceder a una dirección dada explícitamente; en programación de bajo nivel, esto generalmente se denomina direccióndirección absoluta , o a veces una dirección específica, y se conoce comode punteroen 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 direccionamiento indirecto; vea abajo.

Modelos de memoria

Muchos programadores prefieren abordar la memoria de 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 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 soportaban un modelo de memoria tan plana ; en particular, las máquinas de 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 se obtienen de las tres áreas simultáneamente; menos áreas de almacenamiento (incluso si hubiera el mismo total de bytes de almacenamiento) harían que esas instrucciones se ejecutaran más lentamente.

Modelos de memoria en arquitectura x86.

Los primeros procesadores x86 utilizan direcciones de 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 segmentos) generalmente se establecen en cero y solo los desplazamientos son variables.

Ver también

Referencias

  1. ^ Abrahamson, Karl R. (20 de agosto de 2022). "5.10.1. La Memoria y las Direcciones de la Memoria". Universidad de Carolina del Este . Consultado el 3 de febrero de 2023 .