En informática , los modelos de memoria x86 son un conjunto de seis modelos de memoria diferentes de la CPU x86 que operan 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
En la arquitectura de memoria segmentada x86 de 16 bits, se utilizan cuatro registros para referirse a cuatro segmentos: DS ( segmento de datos ), CS ( segmento de código ), SS ( segmento de pila ) y ES (segmento adicional). Otro registro de 16 bits puede funcionar como un desplazamiento dentro de un segmento determinado, por lo que una dirección lógica en esta plataforma se escribe segmento : desplazamiento , generalmente 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 correspondiente 4 bits a la izquierda (multiplicando efectivamente por 16) y luego suma el desplazamiento.
Por ejemplo, la dirección lógica 7522:F139 produce la dirección física de 20 bits:
Cabe destacar que este proceso genera alias de memoria, de modo que cualquier dirección física tiene hasta 4096 direcciones lógicas correspondientes. Esto complica la comparación de punteros a diferentes segmentos.
Tamaños de puntero
Los formatos de puntero se conocen como near , far o huge . Estos ejemplos cargan dos enteros adyacentes en AX y DX desde una dirección almacenada en [reg].
- 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 dato). Los punteros cercanos pueden almacenarse en registros (normalmente BX, SI y DI).
mov bx , palabra [ reg ] mov ax , palabra [ bx ] mov dx , palabra [ bx + 2 ]- Los punteros lejanos son punteros de 32 bits que contienen un segmento y un desplazamiento. Para usarlos, se utiliza el registro de segmento ES mediante la instrucción
LES Reg, dword ptr [mem]. [ 1 ] Pueden hacer referencia a hasta 1024 KiB de memoria. Tenga en cuenta que la aritmética de punteros (suma y resta) no modifica la parte del segmento del puntero, solo su desplazamiento. Las operaciones que superan los límites de cero o 65535 (0xFFFF) se someterán auna operación módulo 64K como 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 llega a (0x10000), la dirección absoluta resultante se reinicia a 0x5000:0000.
les bx , dword [ reg ] mov ax , word [ es : bx ] mov dx , word [ es : bx + 2 ]- Los punteros grandes 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 (es decir, que abarque más de 64 KB) y permite comparaciones precisas de punteros, como si la plataforma fuera un modelo de memoria plana : prohíbe el aliasing de memoria como se describió anteriormente, por lo que dos punteros grandes que hacen referencia a la misma ubicación de memoria siempre son iguales.
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 ]En realidad, un compilador puede optimizar el código de puntero Huge anterior sin bifurcaciones. Esta versión decrementa el segmento incondicionalmente y, para compensar, se añade una longitud de segmento (0x10) a BX. A diferencia del ejemplo Huge anterior , esta versión no requiere que el desplazamiento del segmento esté normalizado.
les bx , dword [ reg ] mov ax , word [ es : bx ] mov dx , es dec dx mov es , dx mov dx , word [ es : bx + ( 2 + 0x10 )]Modelos de memoria
Los modelos de memoria son:
Otras plataformas
En modo protegido, un segmento no puede ser a la vez escribible y ejecutable. [ 2 ] [ 3 ] Por lo tanto, al implementar el modelo de memoria Tiny, el registro del segmento de código debe apuntar a la misma dirección física y tener el mismo límite que el registro del segmento de datos. Esto anulaba una de las características del 80286 , que garantiza que los segmentos de datos nunca sean ejecutables y los segmentos de código nunca sean escribibles (lo que significa que el código automodificable nunca está permitido). Sin embargo, en el 80386 , con su unidad de gestión de memoria paginada, es posible proteger páginas de memoria individuales contra la escritura. [ 4 ] [ 5 ]
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 resulta en punteros de 48 bits) y existen compiladores del lenguaje C que lo admiten. [ 6 ] Sin embargo, la segmentación en modo de 32 bits no permite acceder a un espacio de direcciones mayor que el que cubriría un solo segmento, a menos que algunos segmentos no estén siempre presentes en la memoria y el espacio de direcciones lineal se utilice simplemente como una caché sobre un espacio virtual segmentado más grande.
x86-64
En la plataforma x86-64 , existen un total de siete modelos de memoria, [ 7 ] ya que la mayoría de las referencias a símbolos son de solo 32 bits de ancho, y si las direcciones se conocen en tiempo de 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.
Véase también
Bibliografía
- Guía del usuario de Turbo C++ versión 3.0 . Borland International, Copyright 1992.
Referencias
- ^ "Conjunto de instrucciones Intel - LES" . Páginas del conjunto de instrucciones Intel . Estambul Teknik Üniversitesi/ Intel . Consultado el 19 de octubre de 2015 .
- ↑ "Manual del desarrollador de las arquitecturas Intel 64 e IA-32: Vol. 3A" . Intel. págs. 3–17 . Consultado el 13 de septiembre de 2011 .
- ↑ "Manual del programador de la arquitectura AMD64, volumen 2: Programación del sistema" ( PDF) . AMD. págs. 82–84 . Consultado el 13 de septiembre de 2011 .
- ↑ "Manual del desarrollador de las arquitecturas Intel 64 e IA-32: Vol. 3A" . Intel. págs. 4–41 . Consultado el 13 de septiembre de 2011 .
- ↑ "Manual del programador de la arquitectura AMD64, volumen 2: Programación del sistema" (PDF) . AMD. pág. 139. Consultado el 13 de septiembre de 2011 .
- ↑ "Referencia del lenguaje C de Open Watcom, versión 2" (PDF) . github.com/open-watcom . Open Watcom . Consultado el 10 de enero de 2018 .
- ↑ "Interfaz binaria de la aplicación System V, suplemento del procesador de arquitectura AMD64, versión preliminar 0.99.7" (PDF) . págs. 33–35 .
- Memoria de computadora
- Gestión de memoria X86