En informática , los modelos de memoria x86 son 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.
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 adicional). Otro registro de 16 bits puede actuar como un 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 hacia 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 conduce a un alias de la memoria, de modo que cualquier dirección física determinada tiene hasta 4096 direcciones lógicas correspondientes. Esto complica la comparación de punteros a diferentes segmentos.
Los formatos de puntero se conocen como cercano , lejano o enorme .
mov bx , palabra [ reg ] mov ax , palabra [ bx ] mov dx , palabra [ bx + 2 ]
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 excedan 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 está configurado en 0x5000 y el desplazamiento se incrementa, en el momento en que este desplazamiento del contador se convierta en (0x10000), la dirección absoluta resultante pasará a 0x5000:0000. les bx , dword [ reg ] mov ax , palabra [ es : bx ] mov dx , palabra [ es : bx + 2 ]
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 move es , dx lbl : mov dx , word [ es : bx ]
Los modelos de memoria son:
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 anuló una de las características del 80286 , que garantiza que los segmentos de datos nunca sean ejecutables y que 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. [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 siempre estén presentes en la memoria y el espacio de direcciones lineal solo se use como caché en un espacio más grande. Espacio virtual segmentado. [ cita necesaria ] Permite una mejor protección para el acceso a varios objetos (las áreas de hasta 1 MB de largo pueden beneficiarse de una granularidad de protección de acceso de un byte, en comparación con la granularidad gruesa de 4 KiB que ofrece la paginación única) y, por lo tanto, solo se usa en especializados aplicaciones, como software de telecomunicaciones. [ cita necesaria ] Técnicamente, el espacio de direcciones "plano" de 32 bits es un modelo de memoria "pequeño" para el espacio de direcciones segmentado. Bajo ambos reinados, los cuatro registros de segmento contienen el mismo valor.
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 sólo a cómo se pueden colocar los valores a los que se debe acceder mediante símbolos.