sexta-feira, 28 de abril de 2023

Nostalgia - Instalando o Windows 2.x (Windows/286 e Windows/386) em 2023!

Pessoal,


Agora vamos instalar o Windows 2.x.

Essa versão foi lançada em dezembro de 1987 e consistia de duas versões: uma versão (Windows/286) para os processadores 8086, 8088, 80186 e 80286 e outra (Windows/386) para o 80386.

As caixas das versões eram assim:



Além das melhorias gráficas dessa versão (o Windows 1.x foi muito criticado na época pois a parte gráfica estava muito atrás das versões do System da Apple e do Visi On da VisiCorp), a Microsoft teve que trabalhar bastante no acesso à memória dos PCs nessa versão do Windows. Isto porque a versão inicial (2.0) somente acessava a memória alta (acima de 640KB) nos 80386; os PCs com processadores mais antigos (8086, 8088, 80126 e 80286) somente acessavam a memória convencional (os primeiros 640KB da RAM).

Posteriormente, em 1988, foi lançada a versão 2.1 para 286 (o já citado Windows/286) que usava o driver HIMEM.SYS para acessar a memória alta e aumentando a memória disponível. Essa versão funcionava também nos 8086, 8088 e 80186.

Também foi lançado em 1988 a versão Windows/386 além de usar o HIMEM.SYS para aumentar a memória utilizável, acessava o modo Virtual 8086 do processador 80386. Esse modo permitia a realização de multitarefa de aplicativos MS-DOS junto com os do Windows (o comportamento, na ausência desse modo Virtual 8086 era suspender a execução do aplicativo que não estivesse em primeiro plano).

Bom, deixa eu ir mais devagar. Primeiro, porque isso é meio complicado. Segundo, porque entender tudo isso vai ajudar a configurar tudo. Terceiro, porque esse assunto é bem interessante e eu gosto de estudar isso.

Lá na década de 1970/1980 os computadores eram, em sua maioria, de 8 bits. Isso quer dizer que os registradores eram de 8 bits, mas o barramento de endereços era de 16 bits (2ˆ16 = 65.536 endereços ou 64k). Resumindo: um computador de 8 bits tinha registradores de 8 bits, acessava endereços de 16 bits para ler/escrever valores de 8 bits na RAM.

Depois vieram os processadores de 16 bits (registradores de 16 bits), mas esses processadores NÃO acessavam endereços de 32 bits, como seria de se imaginar. Endereços de 32 bits endereçam 4GB de RAM (2ˆ32 = 4.294.967.296). O problema é que em 1982, quando os primeiros processadores de 16 bits foram lançados (80186 e 80286), o megabyte custava cerca de 290 dólares (veja aqui). Assim, 4GB custariam singelos (US$ 289.21 x 1024MB x 4) US$ 1.184.604,16 !!! Isso mesmo, mais de um milhão de dólares!!! Isso sem contar na complexidade do processador precisar acessar mais portas, conexões, etc. Era desnecessário que um processador endereçasse 32 bits nessa época, era desperdício de esforço e de dinheiro! 

A Intel, então, resolveu limitar a quantidade de endereços acessíveis pelos processadores. Usando uma complexa gambiarra lógica, os processadores tinham registradores de 8 bits (os 8086 e 8088) ou 16 bits (80126 e 80286) mas acessavam endereços de 20 ou 24 bits (2ˆ20 = 1.048.576 bits ou 1MB e 2ˆ24 = 16.777.216 bits ou 16MB).

Para isso, usavam dois blocos de endereços de 16 bits (de 0000:0000 até FFFF:FFFF), o primeiro bloco chamado "segmento" e o segundo chamado "offset". O cálculo era o seguinte: pegava-se os 16 bits do primeiro bloco, multiplicava-se por &H10 e somava com o offset.

Por exemplo (tá tudo em hexadecimal, ok?): FFFF:0010 endereçava para FFFF x 10 = FFFF0 + 0010 =  100000. Esse valor (&H100000) corresponde a 1.048.576 bits ou 1024KB ou 1MB, ou seja, o maior endereço que 20 bits consegue endereçar.

Só que o maior endereço possível seria FFFF:FFFF, que daria FFFF x 10 = FFFF0 + FFFF = 10FFEF ou 1.114.095 ou 1087KB ou 1MB + 63KB. Esses 63KB, no final dos endereços, é chamado de HMA (High Memory Area).

Os processadores 8086 e 8088 só endereçam, como foi dito, endereços de 20 bits ou 1MB. Já os 80186 e 80286 conseguiam acessar esses últimos 63KB de endereços.

A memória era utilizada assim, pra resumir: o DOS, os programas e os drivers eram carregados nos primeiros 640KB da RAM (de &H00000 a &H9FFFF), chamada de "Memória Convencional". Os endereços acima do &HA0000 até &HFFFFF eram reservados (por exemplo, de &HA0000 até &HCFFFF é reservado para vídeo; de &HF0000 até &HFFFFF é para BIOS, etc). Essa região da memória é conhecida por Upper Memory Area ou UMA. A acima dela ainda tem a HMA (de 63KB). Leia mais sobre o gerenciamento de memória do MS-DOS aqui


Logo viu-se que apenas 640KB de memória era pouco, só que mais memória ainda era caro demais.

Uma das gambiarras soluções foi fazer o que já era usado nos computadores de 8 bits ou nos videogames antigos: cartuchos. Quer dizer, um hardware especial que tinha mais memória RAM. Essa memória era chamada de Expanded Memory, Memória Expandida ou EMS. Basicamente era mais RAM (iam até 8MB ou mais) era dividida em "páginas" de 16KB e que eram carregadas para a UMA. Quando uma informação alocada nessa EMS (área depois do 1MB) era solicitada, a página de 16KB onde estava o dado era carregada para a UMA e acessada para trabalho. Inicialmente esse controle da EMS era realizado por hardware especializado, mas com a chegada dos 80386, o controle do EMS passou a ser realizado por software.

Desde os 80286, era possível colocar mais memória acima de 1MB e acessar dados dos programas, mas não o programa em si (que precisava ficar nos 640KB da memória convencional). Essa é a Memória Estendida ou XMS. Mas claro que não era fácil...

O MS-DOS normalmente liberava o acesso a apenas 1MB, chamado de modo real (era como rodava um 8086 com endereço de 20 bits); para acessar a memória estendida, XMS, era necessário reiniciar o computador para acessar um outro modo, o modo protegido, onde o sistema operacional criava tabelas para controlar o endereçamento dos programas. No modo protegido, para detalhar um pouco mais, são criados endereços virtuais e cada programa acessa esses endereços achando que está acessando a memória real, mas na verdade está acessando uma memória virtual gerenciada pelo sistema operacional e suas tabelas de alocação de memória. Apenas o SO tem acesso a tabela "global" (GDT ou Global Description Table) e, obviamente, apenas um dos dois modos era permitido por vez.

Nos 80286 era permitido acessar, como dito acima, endereços de 24 bits, ou seja, até 16MB de RAM, mas cada programa acessava apenas 8MB. Para acessar essa XMS, era necessário configurar o driver "himem.sys" na inicialização do computador (quando o DOS carregava o "config.sys") e colocar o comando "DOS = HIGH, UMB", para o DOS acessar a UMA e carregar vários drivers nesses 384KB da UMA. Nesse local também era carregado um gerenciador de memória, geralmente o EMM386 (ou o QEMM), para emular a EMS e carregar as páginas da XMS. Ainda tinham outras configurações para o config.sys (LH para utilitários residentes e DEVICEHIGH para drivers) para carregar os drivers para a HMA (aqueles últimos 63KB). Assim, vários drivers eram alocados na UMA, liberando memória convencional para programas e permitindo o acesso ao EMS e XMS. Esses drivers eram: ANSI.SYS (para resoluções de texto e cores), drivers de dispositivos SCSI e de rede, drivers para mouses (MOUSE.EXE) e CD (MSCDEX.EXE), etc.

Por exemplo, para carregar o ANSI.SYS na UMB, o arquivo CONFIG.SYS ficaria mais ou menos assim:

  DEVICE=C:\DOS\HIMEM.SYS
  DEVICE=C:\DOS\EMM386.EXE
  DEVICEHIGH=C:\DOS\ANSI.SYS

Já o AUTOEXEC.BAT para carregar algumas coisas na UMB ficaria assim:

  LH C:\DOS\MOUSE.EXE
  LH C:\DOS\DOSKEY.EXE
  LH C:\DOS\SMARTDRV.EXE

Resumindo, os processadores eram assim: os 8086 e 8088 (de 8 bits) e os 80186 (de 16 bits), que acessavam endereços de até 20 bits, e o 80286 (de 16 bits), que acessava endereços de até 24 bits. Todo o trabalho era para liberar os 640KB da memória convencional para carregar programas, inicialmente carregando drivres na UMA e, no 80286, na HMA; usando EMS para armazenar e carregar dados em segmentos de 16KB para a UMA e, com o 80286, usando a XMS em modo protegido para acessar todos os 16MB de RAM (ainda que apenas até 8MB para cada programa).

Em 1985 foi lançado o 80386 e aí passamos de 16 bits para 32 bits (registradores) e endereços de até 32 bits (atingindo os 4GB). Nesse processador, foi criado um modo de 8086 virtual para os programas do DOS rodarem isolados uns dos outros (semelhante ao modo protegido, já citado lá pra cima no post).

Mais pra frente, no final da década de 1990, os 32 bits já ficaram pouco para endereçar memória (4GB já começou a ficar pouco para empresas). Aí começou-se a desenhar os processadores 64 bits, capazes de endereçar 18 EB (Exabytes) de RAM. Enquanto os 64 bits não chegavam, começaram a criar espaços nos 4GB da RAM para paginar mais memória (voltando a fazer o que os computadores de 8 bits faziam com os cartuchos ou os de 16 bits faziam com a EMS). Outra solução foi a encontrada pelos Pentium de 32 bits (eles acessavam endereços de 40 bits, que chega a 1TB de RAM, para acessarem mais que 4GB de RAM). Eles usavam a PAE (Extensão de Endereçamento Físico) e a AWE (Extensão de Janela de Endereço). Para mais detalhes, tem esse artigo aqui da Microsoft.

Só para completar a informação: os processadores atuais (2023) de 64 bits tem registradores de 64 bits mas endereçam em 50 bits (1 Petabyte de RAM), pois, como dito, 18 EB ainda tá um pouco longe pra gente...

O Fábio Akita tem um vídeo excelente sobre esse assunto (veja aqui). Recomendo muito que assistam os vídeos dele.

Bom, tudo isso para explicar sobre as diferenças das versões do Windows 2.0, 2.1/286 e 2.1/386...

Vamos em frente!

Primeiro vamos instalar o Windows 2.1/286 usando os disquetes 5 1/4 abaixo em cima do DOS 5.0:





Após selecionar o primeiro disco (Setup), mudar para "A:" (drive de disquete) e rodar o executável "setup.exe", caímos nessa tela aqui:


Era assim que as coisas eram instaladas no MS-DOS... E já tivemos o primeiro problema:


Olhando o arquivo CONFIG.SYS, a gente vê isso aqui:


Antes de explicar a solução, vamos entender esse arquivo. Primeiramente, para acessar o arquivo basta executar o comando "C:> EDIT CONFIG.SYS". O CONFIG.SYS é usado para carregar drivers e configurar alguns parâmetros do sistema. A diretiva DEVICE carrega os drivers para a memória convencional e DEVICEHIGH (como dito lá pra cima), carrega esses drivers para a memória alta (HMA). A diretiva DOS=HIGH determina carregar o DOS na HMA e FILES=10 permite carregar até 10 programas ao mesmo tempo pelo sistema.

Conforme a gente viu, está determinando que o DOS seja carregado na HMA (aqueles últimos 63KB, lembram?) e o Windows recomenda liberar a HMA. Assim, para resolver isso, vou mandar trocar o carregamento para a UMA (Upper Memory Area, a área com 384KB acima da Memória Convencional). Para isso, é só mudar a diretiva para "DOS=UMB".

Depois de mudar isso, salvar o arquivo e reiniciar o computador, executamos o "A:> SETUP.EXE" novamente, mandamos instalar o Windows e agora fica assim: 


Ótimo! Resolvemos esse problema! Vamos em frente. A próxima etapa pergunta qual o tipo de computador. Aqui, vou escolher "IBM AT (or 100% compatible)" e aceitar as configurações recomendadas (vídeo VGA, US Keyboard e Microsoft Mouse).

Agora o Windows quer saber sobre a Memória Estendida, a XMS.

(Notem que é Extended Memory ou XMS e não a Expanded Memory ou EMS!)

Como eu aloquei 32MB para essa VM (nem precisava tudo isso, porque endereçando apenas 2ˆ24 bits, o 80286 acessa até 16MB...), vou clicar E para ir em frente e ir trocando os discos. Na ordem: SETUP, BUILD, DISPLAYS 1 e 2. Na opção para instalar impressoras, optei por declinar e seguir em frente. Agora escolho o país (moedas, pontuação, etc) e já pula para UTILITIES 2 (o 1 deve ser para impressora). Depois para FONTS 1, Desktop Applications Disk e Windows Write Program Disk.

Feito tudo isso, aparece isso aqui agora:


O AUTOEXEC.BAT é um arquivo em lote. Grosso modo, é um arquivo com uma lista de comandos que é executada geralmente sem a intervenção do usuário. Do mesmo modo que o CONFIG.SYS, o AUTOEXEC.BAT também conttém diretivas para o carregamento de programas e permite carregar na Memória Convencional ou HMA (diretivas LOADHIGH ou LH, já citado lá atrás). O que foi informado é que o AUTOEXEC será modificado acrescendo um atalho para o diretório do Windows ("PATH C:\WINDOWS;C:\DOS"). O AUTOEXEC.BAT é o modificado e o AUTOEXEC.BAK é o original.



Se quiser estudar um pouco mais sobre o AUTOEXEC.BAT e CONFIG.SYS, veja aqui e aqui.

Agora o Windows vai tentar configurar a EMS e/ou XMS. Escolher executar o "Memset".



Bom, foi rodar o Memset e esses 32MB não são reconhecidos como EMS ou XMS :(


Enfim. Terminado o processo, a gente reinicializa o sistema e acessa o Windows com "C:>WIN".


Bom, acabada a instalação, resolvi tentar rodar o MEMSET novamente.


Aqui eu dei um "golpe". Falei que irei rodar o Windows/386.



Uai, parece que agora o Windows encontrou quase 32MB de memória estendida (XMS)! Confirmo a criação do SMARTDRV.SYS e...


Pronto!

Nesse vídeo abaixo, confira que o relógio está em segundo plano, mas o ponteiro dos segundos continua a funcionar. Multifarefa on, baby!


Agora vamos instalar o Windows/386.

Aqui no 80386 vamos instalar com disquetes 3 1/2" usando o MS-DOS 6.22:



E essa aqui era a frente da caixa do Windows:


O processo é igual ao outros: inserimos o disco SETUP/BUILD (repare que como esses discos são mais densos e cabem mais dados, são menos discos!). Ele pergunta em qual computador será instalado. Por falta de opção melhor, escolhi "Intel Inboard 386/AT".  A instalação restante é exatamente como a versão 2.1/286.

Do mesmo modo rodou o Memset e do mesmo modo falou que não havia EMS ou XMS instalada. E do mesmo modo estava "DOS=HIGH" e a gente tem que mudar para "DOS=UMB" para liberar a HMA para o sistema. Assim, a gente reinicia a VM pra carregar os drivers novos e corre o MEMSET. Ao contrário da versão do 286, aqui esse "golpe" não rolou :(

Apesar disso, contemplem o Windows 2.1/386 em todo o seu esplendor! :)





Bom, é isso então. Foi um post bem longo, mas com muito conteúdo!

Nenhum comentário:

Postar um comentário