Modelo de memoria Intel - Intel Memory Model

En informática , el modelo de memoria Intel se refiere a un conjunto de seis modelos de memoria diferentes de la CPU x86 que funcionan en modo real y que controlan cómo se utilizan los registros de segmento y el tamaño predeterminado de los punteros.

Segmentación de la memoria

Se utilizan cuatro registros para hacer referencia a cuatro segmentos en la arquitectura de memoria segmentada x86 de 16 bits. DS ( segmento de datos ), CS ( segmento de código ), SS ( segmento de pila ) y ES (segmento extra). Otro registro de 16 bits puede actuar como un desplazamiento en un segmento dado, por lo que una dirección lógica en esta plataforma se escribe segmento : desplazamiento , normalmente en notación hexadecimal . En modo real, para calcular la dirección física de un byte de memoria, el hardware desplaza el contenido del registro de segmento apropiado 4 bits a la izquierda (multiplicando efectivamente por 16) y luego agrega el desplazamiento.

Por ejemplo, la dirección lógica 7522: F139 produce la dirección física de 20 bits:

  75220
+ F139
  84359

Tenga en cuenta que este proceso conduce a la creación de alias de la memoria, de modo que cualquier dirección física dada tiene hasta 4096 direcciones lógicas correspondientes. Esto complica la comparación de punteros con diferentes segmentos.

Tamaños de puntero

Los formatos de puntero se conocen como cerca , lejos o enorme .

  • Los punteros cercanos son desplazamientos de 16 bits dentro del segmento de referencia, es decir, DS para datos y CS para código. Son los punteros más rápidos, pero están limitados a apuntar a 64 KB de memoria (al segmento asociado del tipo de datos). Los punteros cercanos se pueden mantener en registros (normalmente SI y DI).
    mov bx, word [reg]
    mov ax, word [bx]
    mov dx, word [bx+2]
  • Los punteros lejanos son punteros de 32 bits que contienen un segmento y un desplazamiento. Para usarlos, el registro de segmento ES se usa usando la instrucción les [reg]|[mem],dword [mem]|[reg] . Pueden hacer referencia a hasta 1024  KiB de memoria. Tenga en cuenta que la aritmética del puntero (suma y resta) no modifica la parte del segmento del puntero, solo su desplazamiento. Las operaciones que exceden los límites de cero o 65535 (0xFFFF) se someterán a una operación de módulo 64K al igual que cualquier operación normal de 16 bits. Por ejemplo, si el registro de segmento se establece en 0x5000 y el desplazamiento se incrementa, en el momento en que este desplazamiento del contador se convierte en (0x10000), la dirección absoluta resultante pasará a 0x5000: 0000.
    les bx,dword [reg]
    mov ax,word [es:bx]
    mov dx,word [es:bx+2]
  • Los punteros enormes son esencialmente punteros lejanos, pero se normalizan (en su mayoría) cada vez que se modifican para que tengan el segmento más alto posible para esa dirección. Esto es muy lento pero permite que el puntero apunte a múltiples segmentos y permite comparaciones precisas de punteros, como si la plataforma fuera un modelo de memoria plana : prohíbe el aliasing de la memoria como se describe arriba, por lo que dos punteros enormes que hacen referencia a la misma memoria la ubicación es siempre la misma.
    les bx,dword [reg]
    mov ax,word [es:bx]
    add bx,2
    test bx,0xfff0
    jz lbl
    sub bx,0x10
    mov dx,es
    inc dx
    mov es,dx
 lbl:
    mov dx,word [es:bx]

Modelos de memoria

Los modelos de memoria son:

Modelo Datos Código Definición
Diminuto* cerca CS = DS = SS
Pequeña cerca** cerca DS = SS
Medio cerca** lejos DS = SS, múltiples segmentos de código
Compacto lejos cerca segmento de código único, múltiples segmentos de datos
Grande lejos lejos múltiples segmentos de código y datos
Enorme enorme lejos múltiples segmentos de código y datos; una sola matriz puede ser> 64 KB

Otras plataformas

En el modo protegido, un segmento no puede ser tanto escribible como ejecutable. Por lo tanto, al implementar el modelo de memoria Tiny, el registro de segmento de código debe apuntar a la misma dirección física y tener el mismo límite que el registro de segmento de datos. Esto anuló una de las características del 80286 , que garantiza que los segmentos de datos nunca sean ejecutables y los segmentos de código nunca se puedan escribir (lo que significa que nunca se permite la modificación automática del código ). Sin embargo, en el 80386, con su unidad de gestión de memoria paginada , es posible proteger páginas de memoria individuales contra escritura.

Los modelos de memoria no se limitan a programas de 16 bits. También es posible usar la segmentación en modo protegido de 32 bits (lo que da como resultado punteros de 48 bits) y existen compiladores de lenguaje C que lo admiten. Sin embargo, la segmentación en el modo de 32 bits no permite acceder a un espacio de direcciones más grande que el que cubriría un solo segmento, a menos que algunos segmentos no siempre estén presentes en la memoria y el espacio de direcciones lineales se use simplemente como caché en un espacio virtual segmentado más grande. . Permite una mejor protección para el acceso a varios objetos (áreas de hasta 1 MB de longitud pueden beneficiarse de una granularidad de protección de acceso de un byte, en comparación con la granularidad de 4 KiB que ofrece la paginación única) y, por lo tanto, solo se utiliza en aplicaciones especializadas, como telecomunicaciones. software. Técnicamente, el espacio de direcciones "plano" de 32 bits es un modelo de memoria "diminuto" para el espacio de direcciones segmentado. Bajo ambos reinados, los cuatro registros de segmento contienen el mismo valor.

x86-64

En la plataforma x86-64 , existen un total de siete modelos de memoria, ya que la mayoría de las referencias de símbolos tienen solo 32 bits de ancho y si las direcciones se conocen en el momento del enlace (a diferencia del código independiente de la posición ). Esto no afecta a los punteros utilizados, que siempre son punteros planos de 64 bits, sino solo a cómo se pueden colocar los valores a los que se debe acceder mediante símbolos.

Ver también

Bibliografía

  • Guía del usuario de Turbo C ++ versión 3.0 . Borland International, Copyright 1992.

Referencias