assembly - instruction - ¿Para qué está destinado el registro "FS"/"GS"?
x86 assembly (2)
Existe para lo que fueron diseñados y para lo que son utilizados por Windows y Linux.
La intención original detrás de los registros de segmento era permitir que un programa accediera a muchos segmentos diferentes (grandes) de memoria que estaban destinados a ser independientes y formar parte de una tienda virtual persistente. La idea fue tomada del sistema operativo Multics de 1966 , que trataba los archivos como segmentos de memoria simplemente direccionables. No BS "Abrir archivo, escribir registro, cerrar archivo", simplemente "Almacenar este valor en ese segmento de datos virtual" con enjuague de página sucia.
Nuestros sistemas operativos actuales de 2010 son un gran paso atrás, por lo que se los llama "Eunucos". Solo puede abordar el segmento individual de su espacio de proceso, dando un espacio de direcciones llamado "plano (inactivo)". Los registros de segmentos en la máquina x86-32 todavía se pueden usar para registros de segmentos reales, pero nadie se molestó (Andy Grove, ex presidente de Intel, tuvo un ajuste público bastante famoso el siglo pasado cuando descubrió que todos esos ingenieros de Intel gastaron energía y su dinero para implementar esta característica, que nadie iba a usarlo. ¡Vamos, Andy!)
AMD, al ir a 64 bits, decidió que no les importaba si eliminaban Multics como opción (esa es la interpretación benéfica, el menos caritativo es que no tenían ni idea de Multics) y así inhabilitó la capacidad general de los registros de segmento en el modo de 64 bits. Todavía era necesario que los subprocesos accedieran a la tienda local de subprocesos, y cada subproceso necesitaba un puntero ... en algún lugar del estado de subproceso inmediatamente accesible (por ejemplo, en los registros) ... para enrutar la tienda local. Dado que Windows y Linux usaron FS y GS (gracias Nick por la aclaración) para este propósito en la versión de 32 bits, AMD decidió permitir que los registros de segmentos de 64 bits (GS y FS) se usen esencialmente solo para este propósito (creo que se puede hacer que apunten a cualquier parte de su espacio de proceso; no sé si el código de la aplicación puede cargarlos o no). Intel en su pánico de no perder cuota de mercado con AMD en 64 bits, y Andy se retiró, decidió copiar el esquema de AMD.
En mi humilde opinión habría sido arquitectónicamente más bonito hacer que el mapa de memoria de cada hebra tuviera una dirección virtual absoluta (por ejemplo, 0-FFF decir) que era su almacenamiento local de subprocesos (no se necesitaba puntero de registro [segmento]); Hice esto en un sistema operativo de 8 bits en la década de 1970 y fue extremadamente útil, como tener otra gran pila de registros para trabajar.
Entonces, los registros de segmentos ahora son algo así como su apéndice. Sirven un propósito vestigial. Para nuestra pérdida colectiva.
Aquellos que no conocen la historia no están condenados a repetirla; están condenados a hacer algo más tonto.
Entonces sé lo que se supone que son los siguientes registros y sus usos:
CS = Segmento de código (usado para IP)
DS = Segmento de datos (usado para MOV)
ES = Segmento de destino (usado para MOVS, etc.)
SS = Segmento de pila (usado para SP)
Pero, ¿para qué se utilizan los siguientes registros?
FS = "Segmento de archivo"?
GS = ???
Nota: No estoy preguntando sobre ningún sistema operativo en particular; estoy preguntando sobre para qué estaban destinados a ser utilizados por la CPU, en todo caso.
Los registros FS
y GS
son registros de segmentos. No tienen un propósito definido por el procesador, sino que tienen el propósito de que los ejecuten los sistemas operativos. En Windows de 64 bits, el registro GS
se usa para apuntar a las estructuras definidas del sistema operativo. FS
y GS
son comúnmente utilizados por los núcleos del sistema operativo para acceder a la memoria específica del hilo. En Windows, el registro GS
se usa para administrar la memoria específica de hilo. El kernel de Linux usa GS
para acceder a la memoria específica de la CPU.