terça-feira, outubro 03, 2006

Gerenciamento de Memória - 286, o Processador "Brain-Dead"


Como vimos nas partes anteriores, os processadores 8080 e 8086 não tinham nenhum recurso de gerenciamento de memória. Isto mudou com o processador 286 (também conhecido como 80286 e iAPX286), que acrescentou ao 8086
  • capacidade para endereçar até 16MBytes de memória física
  • endereçamento virtual de 1 GByte
  • facilidades para implementação de swap entre memória e disco
  • proteção de memória
  • níveis de privilégio
Infelizmente, embora estas características sejam bastante úteis para sistemas multi-tarefa e até tenham sido implementadas de forma elegante, elas tinham um preço muito caro no 80286: a incompatibilidade com as aplicações DOS. A principal concessão de compatibilidade no 286 consistia no real mode, modo inicial no qual ele se comportava como um 8086, sem nenhum recurso de gerenciamento de memória. Para ter acesso a estes recursos, o processador precisava ser colocado no incompatível modo protegido. Para agravar a situação, a Intel achou que o modo protegido era tão maravilhoso que ninguém iria querer sair dele; a única forma de retornar ao real mode era fazendo um reset (via hardware).

O modo protegido se baseia em mudar a interpretação dos registradores de segmento. No 8086, os registradores de segmento guardavam uma parte do endereço que era somada ao deslocamento especificado pela instrução sendo executada. No modo protegido, o registrador de segmento contém um índice para uma tabela que descreve o segmento.

Entrando um pouco mais em detalhes, no modo protegido o valor em um registrador de segmento é interpretado da seguinte forma:
  • os 13 bits mais significativos são o índice para uma tabela de descritores
  • o bit seguinte indica se é usada a tabela global (GDT) ou local (LDT). Existe ainda uma terceira tabela, para os segmentos usados no vetor de interrupções
  • os 2 bits menos significativos indicam o nível de privilégio
O endereço inicial de cada tabela de descritores é armazenado em um registrador especial (GDTR, LDTR e IDTR). Um sistema operacional pode, por exemplo, trabalhar com uma LDT para cada processo, isolando desta forma a memória acessível por cada um.

Um descritor de segmento no 286 contém:
  • o offset máximo acessível no segmento (16 bits)
  • o endereço físico inicial do segmento (24 bits)
  • um byte de controle de acesso. Este byte indica se o conteúdo do segmento pode ser executado, lido ou escrito (não é permitido ter um segmento que possa ser executado e escrito). Contém ainda um bit que indica se o segmento está presente na memória física e outro para indicar se o segmento foi acessado; estes bits podem ser usados pelo sistema operacional para controlar o swap entre disco e memória. Por último, este byte pode indicar alguns tipos especiais de segmentos/descritores.
Quem estiver curioso em saber mais detalhes, de uma olhada neste documento.

Embora o modo protegido do 286 seja um imenso avanço sobre o 8086, ele tem algumas restrições:
  • a carga de um valor nos registradores de segmento passa a ser lenta, já que envolve um acesso à tabela de descritores que está na Ram, fora do processador
  • os segmentos continuam limitados a 64KBytes
  • o swap entre disco e memória é controlado no nível de segmento
  • não suporta programas que fiquem fazendo contas com os registradores de segmentos, escrevam nos segmentos de código e executem instruções nos segmentos de dados - o que as aplicações DOS costumavam fazer.
O resultado foi que o 286 foi usado como um 8086 rápido pelos usuários do DOS (que eram a maioria). O modo protegido só viria a ser popular com o 386. Como veremos no próximo post desta série, existem vários motivos que levaram Bill Gates a ser referir ao 286 como "brain-dead".

O PC/AT, DOS, Xenix e OS/2

A IBM utilizou o 286 no terceiro micro da linha PC, o PC-AT (o PC original e o PC-XT utilizavam o 8088). Embora fosse muito mais rápido que os modelos anteriores (além de usar um clock mais rápido, o 286 executava as instruções em menos ciclos e o HD também era mais rápido) a IBM claramente segurou o desempenho com medo de atrapalhar as vendas de seus computadores maiores (por exemplo, o PC-AT original usava um clock de 6MHz apesar de os esquemas no manual de referência mencionaram 8MHz). Ao final da "era 286" a IBM tinha menos de metade do mercado (a liderança estava com "Outros") e tinha os modelos mais lentos (8MHz contra 12, 20 ou mesmo 25MHz).

O BIOS do PC/AT trabalhava quase que inteiramente no real mode. A principal exceção era uma função para copiar dados entre o primeiro 1M e o resto da memória. Esta função desabilitava as interrupções, colocava o processador no mode protegido, fazia a cópia e ressetava o processador (através do controlador de teclado). Este processo era suficientemente demorado para atrapalhar uma comunicação serial em andamento.

Junto com o PC/AT a IBM lançou a versão 3 do DOS. A principal alteração no DOS era interna, para permitir o compartilhamento de discos em rede. Entretanto, esta alteração não ficou pronta a tempo; o DOS 3.00 saiu com esta parte do código desabilitada. A versão 3.10 suportava rede porém tinha uma série de bugs que foram corrigidos na versão 3.20. O suporte do DOS ao 286 estava limitado a um driver de ramdisk capaz de usar a memória acima de 1MByte, como visto acima isto não era rápido e podia ter efeitos colaterais indesejados.

O modo protegido do 286 foi usado pelos sistemas *nix, como o Xenix. Entretanto, a ênfase dada era para sistemas multiusuários e a capacidade de um 286 era ainda baixa para isto.

Um legado do 286 foi a insistência da IBM em suportar exclusivamente o modo protegido do 286 na versão 1 do OS/2, ignorando o 386. Isto trouxe uma série de limitações ao OS/2, mesmo em relação ao Windows 3.0, dificultando ainda mais a sua aceitação.

HIMEM

Uma última curiosidade sobre o 286. No 8086 ao somar o segmento deslocado ao offset, o eventual vai-um era ignorado. No 286, que possuia mais bits de endereço físico, este vai-um ia para o bit 20 do endereço. Com medo que isto criasse uma incompatibilidade, a IBM colocou um hardware externo que normalmente forçava o bit 20 do endereço em zero. Entretanto, isto podia ser desligado por software, permitindo acessar 64K acima de 1M no real mode. Isto veio a ser usado no final da vida do 286 e do DOS, quando os 640KBytes de Ram estavam ficando muito apertados.

Um comentário:

Caloni disse...

Essa série está ótima, DQ! Mal espero chegar o próximo capítulo. Ah, e o pdf que você mencionou é muito bom, também. Explica a coisa de forma direta, sem todos os detalhes que costumam estar nas especificações da Intel.

[]s