quinta-feira, outubro 12, 2006

Gerenciamento de Memória - 386


Introdução

Como vimos nas partes anteriores, o 8086 não tinha recursos para gerenciamento de memória. O 286 possuia, mas os recursos não eram usados devido às incompatibilidades com o 286. Em 1985, quando parecia que a Intel estava perdendo a batalha dos microprocessadores, foi lançado o 386 que, de uma só vez:
  • evoluiu a arquitetura x86 para 32 bits
  • aumentou a capacidade de endereçamento
  • acrescentou o recurso de paginação da memória
  • introduziu o modo 8086 virtual
Do ponto de vista prático, estas características viabilizaram sistemas multitarefa com proteção entre tarefas e memória virtual sem sacrificar a compatibilidade com o 8086 (ou com o 286).

Podemos dizer que a arquitetura de software do 386 definiu o padrão para as duas décadas seguintes.

Neste post foi falar basicamente do processador, em posts seguintes vou falar sobre o impacto do 386 no DOS e sobre o gerenciamento de memória no Windows 16 bits.

Passando dos 16 para os 32 bits

Assim como os registradores do 8086 eram uma extensão dos registradores do 8080, o 386 são uma extensão dos registradores do 8086:

O 386 pode trabalhar com operandos de 8, 16 e 32 bits. Novos modos de endereçamento foram introduzidos, permitindo em vários casos usar qualquer registrador onde antes somente alguns podiam ser usados. O processador passou a ser capaz de multiplicar automaticamente um índice por um fator de escala de 1, 2, 4 ou 8.

Por estes motivos, o 386 é capaz de operar em um modo 16 bits (com as instruções codificadas como no 8086 e 286) e num novo modo 32 bits. O modo "default" é definido pelo descritor do segmento de código (como veremos adiante), porém pode ser alterado instrução a instrução, acrescentando prefixos a ela. Isto significa que mesmo sob o DOS, rodando em 16 bits, um programa pode fazer operações de 32 bits.

Existe um prefixo para alterar o tamanho do operando. No modo 32 bits, os operandos tem 8 ou 32 bits; no modo 16 bits os operandos tem 8 ou 16 bits. Um outro prefixo controla o tamanho do endereço entre 32 e 16 bits.

O 386 continua usando registradores de segmento. Entretando, com deslocamentos de 32 bits passa a ser muito incomum precisar dividir código ou dados de um programa em vários segmentos.

Modo Protegido no 386

Como o 286, o modo 386 pode operar em modo real e em modo protegido. No modo protegido os registradores de segmentos continuam sendo índices para uma tabela de descritores. Tanto no 286 como no 386 os descritores ocupam 8 bytes, porém no 386 o endereço base e o deslocamento foram aumentados para 32 bits, aproveitando bytes não usados no 286.

O fato do formato dos descritores serem diferentes entre o 386 e 286 permite ao processador descobrir que tipo de código está no interior do segmento e utilizar o modo default de operação (32 ou 16 bits) adequado.

O 386 permite retornar do modo protegido para o modo real, mas isto é praticamente desnecessário graças ao modo 8086 virtual.

Modo 8086 Virtual

No 286, a emulação do 8086 estava restrita ao modo real, que afeta o comportamento de todas as tarefas e desliga as proteções e mapeamentos do gerenciamento de memória. O modo 8086 virtual permite ao 386 executar tarefas que emulam o 8086 dentro do ambiente protegido.

No modo 8086 virtual, os endereços são calculados como no 8086. O modo default de operação é 16 bits. O sistema operacional pode controlar que instruções críticas e quais portas de entrada e saída o programa pode utilizar. Quando o programa tenta executar um instrução proibida ou acessar uma porta bloqueada, o controle passa ao sistema operacional, que pode emular a instrução ou acesso se desejar.

Paginação da Memória

No 386 os endereços lineares obtidos tanto no modo protegido (a partir do descritor do segmento) como no modo 8086 virtual (somando o segmento multiplicado por 16 ao deslocamento) passam por mais uma etapa antes de gerarem um acesso à memória física.

Na paginação, o endereço linear é quebrado em páginas de 4K. Estas páginas são convertidas em endereços físicos através de duas tabelas:
  • Diretório de páginas: divide os 4G de endereçamento linear em 1024 grupos de página com 4M cada. A cada grupo está associado uma entrada de 32 bits que indica se o grupo está na memória e, se sim, qual o endereço da tabela de páginas correspondente.
  • Tabela de páginas: possui uma entrada de 32 bits para cada página. Esta entrada indica se a página está na memória. Se sim, indica qual o endereço físico correspondente, se ela foi acessada e se ela foi alterada. Estas duas últimas informações podem ser usadas pelo sistema operacional para otimizar o swap entre a memória e o disco. Quando a memória física ficar cheia e o sistema precisar mover uma página para o disco, pode ser implementada uma política LRU (retirar a página que foi acessada a mais tempo). Se uma página foi carregada do disco para a memória e não foi alterada, ela no precisa ser salva em disco antes de usar a memória física para outra página.
Questões Comercias e Estratégicas

Do ponto de vista técnico, o 386 foi uma ruptura comparável à passagem do 8080 ao 8086. O seu impacto, porém, não se limitou à parte técnica:
  • Para a Microsoft, o 386 viabilizou o Windows. Primeiro por fornecer a capacidade de processamento e endereçamento necessária e segundo por viabilizar a transição gradual, através das janelas DOS.
  • Para a Intel, o 386 foi o momento de se desgrudar dos demais fabricantes de chips. Até esta época era praxe um fabricante licenciar os seus projetos para os outros, criando o second source. Isto permitia ao fabricante original aumentar a capacidade de produção sem maiores investimentos e dava uma garantia adicional de fornecimento aos compradores. Por outro lado, isto reduzia o lucro do fabricante original. A Intel não licenciou o 386 para outros fabricantes. Foi somente após longos trabalhos de engenharia reversa e longas disputas judiciais que a Intel voltou a ter concorrentes na linha x86.
  • Para a IBM, o 386 aumentou o medo. Alí estava um chip que rivalizava os recursos de seus computadores (não pessoais) de pequeno e médio porte, a um preço muito inferior.
  • Para os demais fabricantes, foi o momento em que a IBM piscou. O primeiro computador com o 386 foi lançado não pela IBM mas por uma empresa mais conhecida pelos seus computadores portáteis: a Compaq. Apesar da tentativa com o PS/2, a IBM não voltou a controlar a plataforma.
Por tudo isto, existiu uma pressão muito grande a favor do 386 e contra o 286. Inicialmente o custo do 386 limitou o seu uso aos sistemas mais sofisticados. Posteriormente a Intel lançou o 386SX que utilizava memória de 16 bits (estatégia semelhante à do 8088).

Nenhum comentário: