Para que serve o registro “FS” / “GS”?

Então eu sei o que os seguintes registros e seus usos devem ser:

Mas quais são os seguintes registros destinados a serem usados?

  • FS = “Segmento de Arquivo”?

  • GS = ???

Nota: Eu não estou perguntando sobre qualquer sistema operacional em particular – estou perguntando sobre o que eles deveriam ser usados ​​pela CPU, se houver alguma coisa.

Existem para o que foram destinados e para o que são usados ​​pelo Windows e pelo Linux.

A intenção original por trás dos registros de segmento era permitir que um programa acessasse muitos segmentos (grandes) de memory diferentes que deveriam ser independentes e parte de uma loja virtual persistente. A idéia foi tirada do sistema operacional Multics, de 1966 , que tratava os arquivos como segmentos de memory endereçáveis. No BS “Abrir arquivo, gravar registro, fechar arquivo”, apenas “Armazenar este valor nesse segmento de dados virtuais” com limpeza de página suja.

Nossos sistemas operacionais atuais de 2010 são um gigantesco passo para trás, e é por isso que eles são chamados de “eunucos”. Você só pode endereçar o segmento único do seu espaço de processo, dando o chamado “espaço de endereço flat (IMHO)”. Os registros de segmento na máquina x86-32 ainda podem ser usados ​​para registradores de segmento reais, mas ninguém se incomodou (Andy Grove, ex-presidente da Intel, teve um público bastante famoso no século passado quando descobriu que todos os engenheiros da Intel gastaram energia e seu dinheiro para implementar esse recurso, que ninguém iria usá-lo. Vá, Andy!)

A AMD em 64 bits decidiu que eles não se importavam se eles eliminassem Multics como uma escolha (essa é a interpretação caridosa; a falta de caridade é que eles não sabiam nada sobre Multics) e assim desativaram a capacidade geral de registradores de segmento no modo de 64 bits. Ainda havia uma necessidade de encadeamentos para acessar o armazenamento local do encadeamento, e cada encadeamento precisava de um ponteiro … em algum lugar no estado de encadeamento imediatamente acessível (por exemplo, nos registradores) … para encadear o armazenamento local. Como o Windows e o Linux usaram o FSand GS (obrigado Nick pelo esclarecimento) para essa finalidade na versão de 32 bits, a AMD decidiu permitir que os registradores de segmento de 64 bits (GS e FS) sejam usados ​​essencialmente apenas para esse propósito (acho que você pode faça-os apontar para qualquer lugar em seu espaço de processo; não sei se o código do aplicativo pode carregá-los ou não). A Intel em pânico para não perder mercado para a AMD em 64 bits, e Andy sendo aposentado, decidiu copiar o esquema da AMD.

Teria sido IMHO arquitetonicamente mais bonito para fazer o mapa de memory de cada thread ter um endereço virtual absoluto (por exemplo, 0-FFF dizer) que era seu armazenamento local de thread (nenhum ponteiro de registro de [segmento] necessário!); Eu fiz isso em um sistema operacional de 8 bits nos anos 70 e foi extremamente útil, como ter outra grande pilha de registros para trabalhar.

Então, os registradores de segmento agora são como o seu apêndice. Eles servem a um propósito residual. Para nossa perda coletiva.

Aqueles que não conhecem a história não estão condenados a repeti-la; eles estão condenados a fazer algo mais burro.

Os registradores FS e GS são registradores de segmento. Eles não têm uma finalidade definida pelo processador, mas, em vez disso, recebem o propósito do OS de executá-los. No Windows de 64 bits, o registrador GS é usado para apontar para estruturas definidas pelo sistema operacional. FS e GS são comumente usados ​​pelos kernels do SO para acessar a memory específica do thread. No Windows, o registrador GS é usado para gerenciar a memory específica do thread. O kernel do Linux usa o GS para acessar a memory específica da CPU.