Por que as CPUs x86 usam apenas dois de quatro “anéis”?

why-do-x86-cpus-only-use-two-out-of-four-rings-00

Ao aprender mais sobre como os sistemas operacionais e o hardware em que funcionam funcionam e interagem entre si, você pode se surpreender ao ver o que parece ser esquisitices ou subutilização de “recursos” ocorrendo. Por que é que? O post de perguntas e respostas do superusuário de hoje tem a resposta para a pergunta de um leitor curioso.

A sessão de perguntas e respostas de hoje chega até nós como cortesia do SuperUser – uma subdivisão do Stack Exchange, um grupo de sites de perguntas e respostas voltado para a comunidade.

Foto cortesia de Lemsipmatt (Flickr) .

A questão

O leitor de superusuário AdHominem quer saber por que as CPUs x86 usam apenas dois de quatro anéis:

Os sistemas x86 baseados em Linux e Windows usam apenas Ring 0 para modo kernel e Ring 3 para modo usuário. Por que os processadores ainda distinguem quatro anéis diferentes se todos eles acabam usando apenas dois deles de qualquer maneira? Isso mudou com a arquitetura AMD64?

Por que as CPUs x86 usam apenas dois de quatro anéis?

A resposta

O contribuidor do SuperUser Jamie Hanrahan tem a resposta para nós:

Existem duas razões principais.

A primeira é que, embora as CPUs x86 ofereçam quatro anéis de proteção de memória, a granularidade da proteção oferecida é apenas no nível por segmento. Ou seja, cada segmento pode ser definido para um anel específico (nível de privilégio) junto com outras proteções como desativado para gravação. Mas não existem muitos descritores de segmento disponíveis. A maioria dos sistemas operacionais gostaria de ter uma granularidade muito mais fina de proteção de memória, como … para páginas individuais.

Portanto, insira a proteção baseada em tabela de página. A maioria, senão todos, os sistemas operacionais x86 modernos mais ou menos ignoram o mecanismo de segmentação (tanto quanto podem, de qualquer maneira) e contam com a proteção disponível dos bits de ordem inferior nas entradas da tabela de páginas. Um deles é chamado de bit “privilegiado”. Este bit controla se o processador deve ou não estar em um dos níveis “privilegiados” para acessar a página. Os níveis “privilegiados” são PL 0, 1 e 2. Mas é apenas um bit, portanto, no nível de proteção página a página, o número de “modos” disponíveis no que diz respeito à proteção de memória é apenas dois: Uma página pode ser acessível de modo não privilegiado ou não. Portanto, apenas dois anéis. Para ter quatro anéis possíveis para cada página, eles teriam que ter dois bits de proteção em cada entrada da tabela de página para codificar um dos quatro números de anel possíveis (assim como fazem os descritores de segmento). No entanto, eles não o fazem.

O outro motivo é o desejo de portabilidade do sistema operacional. Não se trata apenas de x86; O Unix nos ensinou que um sistema operacional pode ser relativamente portátil para arquiteturas de múltiplos processadores, e que isso é uma coisa boa. E alguns processadores suportam apenas dois anéis. Por não depender de vários anéis na arquitetura, os implementadores do sistema operacional tornaram os sistemas operacionais mais portáteis.

Há um terceiro motivo específico para o desenvolvimento do Windows NT. Os designers da NT (David Cutler e sua equipe, que a Microsoft contratou fora do DEC Western Region Labs) tinham vasta experiência anterior em VMS; na verdade, Cutler e alguns dos outros estavam entre os designers originais da VMS. E o processador VAX para o qual o VMS foi projetado tem quatro anéis (o VMS usa quatro anéis).

Mas os componentes executados nos anéis 1 e 2 do VMS (Serviços de gerenciamento de registros e CLI, respectivamente) foram deixados de fora do design do NT. O Ring 2 no VMS não era realmente sobre a segurança do sistema operacional, mas sim sobre a preservação do ambiente CLI do usuário de um programa para o outro, e o Windows não tinha esse conceito; a CLI funciona como um processo comum. Quanto ao Anel 1 do VMS , o código RMS no Anel 1 teve que chamar o Anel 0 com bastante frequência, e as transições de toque são caras. Descobriu-se que era muito mais eficiente ir para o Anel 0 e terminar com ele do que ter muitas transições do Anel 0 dentro do Anel 1 código (novamente, não que o NT tenha algo parecido com RMS de qualquer maneira).

Quanto ao motivo pelo qual o x86 implementou quatro anéis enquanto os sistemas operacionais não os utilizavam, você está falando sobre sistemas operacionais de design muito mais recente do que o x86. Muitos dos recursos de programação do sistema do x86 foram projetados muito antes de o NT ou os verdadeiros kernels Unix-ish serem implementados nele, e eles não sabiam realmente o que o sistema operacional usaria. Não foi até que obtivemos a paginação no x86 que pudemos implementar verdadeiros kernels Unix ou VMS.

Não apenas os sistemas operacionais x86 modernos ignoram amplamente a segmentação (eles apenas configuram os segmentos C, D e S com um endereço base de 0 e tamanho de 4 GB; os segmentos F e G às vezes são usados ​​para apontar para as principais estruturas de dados do sistema operacional ), eles também ignoram amplamente coisas como “segmentos de estado de tarefa”. O mecanismo TSS foi claramente projetado para a troca de contexto de thread, mas tem muitos efeitos colaterais, então os sistemas operacionais x86 modernos fazem isso “manualmente”. A única vez que o x86 NT muda as tarefas de hardware é em algumas condições verdadeiramente excepcionais, como uma exceção de falha dupla.

Com relação à arquitetura x64, muitos desses recursos desativados foram deixados de fora. Para seu crédito, a AMD realmente conversou com as equipes do kernel do sistema operacional e perguntou o que eles precisavam do x86, o que não precisavam ou não queriam e o que gostariam de adicionar. Os segmentos no x64 existem apenas no que pode ser chamado de forma vestigial, a alternância de estado da tarefa não existe etc. e os sistemas operacionais continuam a usar apenas dois anéis.


Tem algo a acrescentar à explicação? Som desligado nos comentários. Quer ler mais respostas de outros usuários do Stack Exchange com experiência em tecnologia? Confira o tópico de discussão completo aqui .

Recomendado:  As melhores maneiras de proteger seu servidor SSH