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 memoria
En la arquitectura de memoria segmentada x86 de 16 bits se utilizan cuatro registros para hacer referencia 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 actuar como desplazamiento en un segmento determinado, 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 suma el desplazamiento.
Por ejemplo, la dirección lógica 7522:F139 produce la dirección física de 20 bits:
Tenga en cuenta que este proceso genera alias en 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 a diferentes segmentos.
Tamaños de puntero
Los formatos de puntero se conocen como cercano , lejano 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 almacenar en registros (normalmente 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 utilizarlos, se utiliza el registro de segmento ES mediante la instrucción
les [reg]|[mem],dword [mem]|[reg]. [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 exceden los límites de cero o 65535 (0xFFFF) se someterán a una operación de módulo 64K como cualquier operación normal de 16 bits. Por ejemplo, si el registro de segmento se establece en 0x5000 y se está incrementando el desplazamiento, en el momento en que este desplazamiento del contador se convierta en (0x10000), la dirección absoluta resultante pasará a ser 0x5000:0000.
les bx , dword [ reg ] mov ax , palabra [ es : bx ] mov dx , palabra [ es : bx + 2 ]
- Los punteros enormes son esencialmente punteros lejanos, pero (en su mayoría) se normalizan 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 alias de memoria como se describió anteriormente, por lo que dos punteros enormes que hacen referencia a la misma ubicación de memoria siempre son iguales.
les bx , dword [ reg ] mov ax , palabra [ es : bx ] añadir bx , 2 prueba bx , 0xfff0 jz lbl sub bx , 0x10 mov dx , es inc dx mov es , dx lbl: mov dx , palabra [ es : bx ]
Modelos de memoria
Los modelos de memoria son:
Otras plataformas
En el 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 anuló una de las características del 80286 , que asegura que los segmentos de datos nunca sean ejecutables y los segmentos de código nunca sean escribibles (lo que significa que nunca se permite el código automodificable ). Sin embargo, en el 80386, con su unidad de administración de memoria paginada, es posible proteger páginas de memoria individuales contra escritura. [4] [5]
Los modelos de memoria no se limitan a programas de 16 bits. También es posible utilizar 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. [6] Sin embargo, la segmentación en 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 estén siempre presentes en la memoria y el espacio de direcciones lineal se use simplemente como caché sobre un espacio virtual segmentado más grande. [ cita requerida ]
x86-64
En la plataforma x86-64 , existen un total de siete modelos de memoria, [7] 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.
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 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 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 .
- ^ "Open Watcom C Language Reference version 2" (PDF) . github.com/open-watcom . Open Watcom . Consultado el 10 de enero de 2018 .
- ^ "Interfaz binaria de aplicación de System V, suplemento de procesador de arquitectura AMD64, versión borrador 0.99.7" (PDF) . págs. 33–35 .