registers instruction div assembly x86 cpu-registers

assembly - instruction - ¿Cuál es el propósito de los registros de segmento en modo protegido x86?



x86 assembly (3)

Necesito modificar algunos archivos DLL, pero no sé, lo que excatly hace segmentos registra ( DS , SS , ...) en modo protegido. Aprendí en la escuela sobre el modo real de 16 bits, donde los registros de segmentos se multiplican por 16 más el desplazamiento en el registro normal da una dirección efectiva en la memoria física. En modo protegido, hay algunos modelos de memoria plana y memoria virtual, donde cada proceso "tiene" 4 GB de memoria, por lo que si los registros tienen 32 bits, entonces puedo direccionar cada byte de la memoria virtual solo por el registro "offset". Entonces, ¿qué pupéses tienen registros de segmento en modo protegido, por ejemplo

mov eax, dword ptr ds:[20037DA0]


Básicamente, el objetivo es el mismo que en el modo real, excepto que la forma en que funcionan es ligeramente diferente. DS en su ejemplo selecciona un descriptor de memoria en su GDT (google este término si realmente quiere entender esto, "Tabla de descriptores globales") que contiene información como dirección base, dirección final, granularidad, etc. Su desplazamiento se agrega a la dirección base , el fin. Si estás en Windows (apuesto a que Linux es el mismo) no tienes que preocuparte por estos registros de segmentos, como dijiste en su modelo plano, eso significa que debe haber solo un descriptor para toda la memoria, así que si no cambias estos registros debería funcionar como si ni siquiera existieran.


Algunos antecedentes históricos

El 8086 siempre usó una ventana fija de 64KiB por segmento cuya dirección de inicio se calculó mediante (segmento de registro * 16). Desde el 80286 hay algunas tablas especiales en la memoria (GDT y LDT). Estas tablas contienen la dirección inicial, la longitud y los derechos de acceso de un segmento. Los registros de segmentos (CS, DS, ES, SS - y desde 80386: FS, GS) contienen índices en estas tablas.

Entonces, teóricamente, un sistema operativo puede establecer el desplazamiento y la longitud de un segmento de una manera que quiera hacer eso: En 8086 DS = 0x0123 significa: El segmento es 64KiB comenzando desde la dirección 0x01230. En el modo de 32 bits, DS = 0x0123 puede significar: Inicio de segmento en la dirección 0xABCD, la longitud es 0xEF bytes; esto depende del contenido de las tablas GDT y LDT creadas por el sistema operativo. Intentar acceder a un segmento fuera de este rango (DS: 0x1000 si la longitud es <0x1000) causará una excepción (interrupción).

Situación actual

Sin embargo, la mayoría de los sistemas operativos modernos de 32 bits ya no usan registros de segmentos. Sus valores se establecen según el modo (kernel o usuario) debido a problemas de derechos de acceso. La dirección de inicio es típicamente 0 y la longitud es 4GiB.

La protección de la memoria real se realiza utilizando la MMU para que no se pueda acceder a algunas áreas de la memoria en el modo de usuario. En los sistemas operativos modernos, la MMU es absolutamente esencial. Asigna una dirección virtual "absoluta" a una dirección física real que verifica violaciones de derechos de acceso.

Hay una excepción: algunos sistemas operativos (Windows y Linux, por ejemplo) usan los segmentos FS y / o GS para apuntar realmente a un área de memoria diferente.

Por este motivo, en el modo de 64 bits, los procesadores x86 usan el registro CS solo para problemas de derechos de acceso y FS y GS se pueden usar para agregar un desplazamiento a cada dirección. Por lo que sé, DS, ES y SS no se utilizan, mientras que el contenido de los registros FS y GS no importa, pero hay registros especiales que explícitamente dan el desplazamiento que se agregará a una operación que utiliza FS o GS.


Le daré una respuesta simple, pero para obtener más información, le recomiendo el siguiente enlace a los documentos de arquitectura de AMD, una lectura muy fácil. PD: No he cubierto Xeon o PAE aquí ..

La arquitectura IA-32 (x86) tiene un bus de direcciones físicas de 32 bits para RAM.

El bus de 32 bits se divide aún más en 2 segmentos de 16 bits, cada uno con capacidad para acceder a 2 GB de RAM, un total de 4 GB.
Esto se llama cambio de banco de memoria.

Para permitir la protección, Intel y MS decidieron utilizar un segmento para kernelmode y el otro para el modo de usuario, razón por la cual Windows históricamente tenía un espacio de direcciones de modo de usuario de 2 GB. Es una limitación de hardware x86, no una limitación de Windows.

El segmento registra el espacio separado del núcleo y las direcciones del espacio de usuario. Así es como se implementó la protección de la memoria.

Además, el IA-32 general también tenía registros internos de 32 bits, por lo que no podía buscar. Este es el modo real (sin traducción de direcciones).

La paginación requiere 36bits, creo (no me digas) que es donde entró IA32e. Los bits adicionales en IA-32e permitieron la paginación desde el HDD, esta es la única forma en que podría ejecutarse en Windows x64 ya que x64 requiere NX y está ubicado en bit 63.

Lea los documentos de arquitectura de AMD, personalmente los encuentro más informativos que las versiones de Intel.

http://developer.amd.com/wordpress/media/2012/10/24593_APM_v21.pdf

Se introdujo PS con memoria plana AMD64, eliminando segmentos.

Sin embargo, los procesos de 32 bits aún necesitan registros de segmentos. En AMD64, cuando un proceso de 32 bits llega a la parte superior de la pila, se lanza un puntero a una dirección base en un nuevo registro de segmento. De esta forma, las aplicaciones de 32 bits pueden comer tanta RAM como quieran, sin límite. Bien dentro de la razón dec ... :)

Espero que esto ayude.