Escritos
B. Piropo
Anteriores:
< Trilha Zero >
Volte de onde veio
16/01/1995

<Acessos em 32 bits - >
< Parte VI: O DOS Extender>


Sabemos que o 386, rodando no modo protegido, consegue manejar diversos programas ao mesmo tempo, em um esquema denominado multitarefa. E mais: no modo 86 virtual, consegue mesmo simular diversos 8086 rodando simultaneamente.

Mas o DOS, o sistema operacional dominante desde quando o 386 foi lançado até hoje, nada "enxerga" além de 1Mb e nada sabe do modo protegido, o que o impede de suportar a multitarefa. Então, para usufruir das delícias do modo protegido, seria necessário ou desenvolver um novo sistema operacional capaz de tirar partido das potencialidades da CPU 386 (que como sabemos é uma CPU "de 32 bits"), como memória plana, memória virtual e modos protegido e 86 virtual, ou inventar uma forma de dar ao DOS acesso à memória acima de 1Mb e permitir que ele tire proveito do modo protegido, sem no entanto modificar sua estrutura básica (ou ele não seria capaz de rodar os programas antigos, desenvolvidos sob as limitações do 8086).

O OS/2, a partir da versão 2.0, é um "sistema operacional de 32 bits" (desenvolvido especialmente para uma CPU de 32 bits), um exemplo da primeira solução. A segunda consiste em estender a capacidade do DOS para além do primeiro mega e do modo real. Isto pode ser feito através de um programa auxiliar. Que recebe, muito apropriadamente, o nome genérico de "DOS Extender".

Para permitir o desenvolvimento DOS Extenders, um grupo de empresas, entre as quais Intel e Microsoft, criou um comitê para padronizar um conjunto de rotinas de programação (ou "serviços"; mais especificamente, serviços das interrupções 2Fh e 31h) destinados a manejar tarefas básicas como mudança de modo da CPU ("mode switching", mudança do modo real para protegido e 86 virtual ou vice-versa), manejo da memória acima de 1Mb (ou memória estendida, que só pode ser acessada em modo protegido) e atendimento a interrupções, também em modo protegido. Estas especificações denominaram-se DPMI, acrônimo de "DOS Protected Mode Interface" e constituem uma interface (camada intermediária) entre o DOS e o modo protegido do 386 (nesse conceito amplo, o modo 86 virtual é considerado "protegido").

Um DOS Extender é um "servidor de DPMI", ou seja, um programa que, obedecendo às especificações da DPMI, se interpõe entre o DOS e os demais programas que rodam no modo protegido ou 86 virtual, interceptando as solicitações de interrupção.

Como já sabemos desde o início desta série, quando um programa precisa de um dos serviços do DOS, emite uma interrupção. Se o programa estiver rodando sob DOS em modo real, o serviço solicitado pela interrupção é prontamente atendido pelo próprio DOS e o programa continua sua faina. Mas como atender a uma interrupção emitida por um programa rodando em modo protegido ou 86 virtual? Lembre-se que o DOS só "entende" o modo real e endereçamento por segmento/deslocamento do esquema segmentado. E nada sabe sobre modo protegido ou endereçamento em memória plana, com seus seletores. Para ele, o universo acaba no limite de 1Mb de memória e nada existe além disso. Então, como atender a um pedido de outro universo?

É aí que entra o DOS Extender. Para quem acompanhou a última série Star Trek, ele funciona mais ou menos como a fenda espacial, unindo dois universos. O DOS Extender roda no modo protegido e fica lá, assuntando, esperando que um programa solicite alguma coisa ao DOS. Enquanto não houver solicitações, ele nada faz. Mas tão logo surge uma (oriunda, portanto, de um "cliente de DPMI"), ele a intercepta e decide o que fazer com ela. E faz, essencialmente, uma dentre três coisas.

A primeira é a mais simples: passa a máquina para o modo real, deixa a solicitação de interrupção prosseguir seu caminho até o DOS (que então pode atendê-la, já que de modo real ninguém entende mais que o DOS), pega de volta o resultado do serviço, retorna a CPU para o modo protegido e repassa o resultado para o programa que o solicitou. É claro que, neste processo, o DOS Extender "traduz" os endereços do esquema de endereçamento de memória plana para segmentada quando passa a solicitação para o DOS em modo real, e vice-versa, quando retorna o resultado ao programa em modo protegido.

A segunda é um pouco mais sofisticada, mas essencialmente igual: tudo se passa de forma idêntica, porém a interrupção não é atendida em modo real, mas sim pelo código do DOS carregado em uma máquina virtual (que roda no modo 86 virtual). Como sabemos, o modo 86 virtual é totalmente equivalente ao modo real, mas dotado de um esquema de proteção da memória. A interrupção ainda é atendida pelo DOS. Mas por um DOS mais civilizado, já que roda em modo 86 virtual.

Finalmente, a terceira maneira é a mais sofisticada: o DOS Extender simplesmente se abstém de repassar a interrupção para o DOS e a atende ele mesmo, inteiramente em modo protegido. Isso é possível porque todos os serviços prestados pelo DOS através de suas interrupções nada mais são que rotinas de programação que executam uma determinada tarefa. E nada impede que o DOS Extender contenha em seu código rotinas capazes de executar a mesma tarefa e apresentar o resultado da mesma forma que o DOS apresentaria, ou seja, "fingir" que foi o DOS que atendeu à solicitação. Para o programa, não faz a menor diferença: ele simplesmente pediu que algo fosse feito, a tarefa solicitada foi executada e ele recebeu de volta as informações que desejava no formato que esperava. Se quem atendeu foi o DOS ou não, pouco importa. Mas a diferença é que, quando atendida pelo DOS Extender, a missão é inteiramente cumprida no modo protegido, ou seja, sem a necessidade de passar a CPU para o modo real ou 86 virtual. Em suma: usando o jargão dos programadores, gurus e demais experts, a tarefa foi executada inteiramente "em 32 bits".

A rigor, esta série poderia acabar aqui (o que até não seria mau: a coisa acabou por complicar mais do que eu esperava e, confesso, quase me arrependi de tê-la iniciado; mas tenha um pouco mais de paciência que só falta uma coluna para que eu volte a falar de banalidades como o famoso bug do Pentium, que está fazendo coçar minha língua desde que a coisa explodiu...). Porque agora você já tem todas as dicas e informações para entender os acessos a disco e a arquivos "em 32 bits" de Windows.

Pois, como você já deve ter percebido, Windows nada mais é que um DOS Extender com uma interface gráfica. Calma: se você é um janelista militante e acha que eu estou de má vontade, não reclame comigo. Reclame com Matt Pietrek, o autor do fascinante livro "Windows Internals", a mais formidável dissecação de um programa que já li. Eu mesmo, na verdade, acho que Windows é um pouco mais que isso. Mas essa frase em itálico aí de cima foi traduzida literalmente da página 82 do livro do Matt...

B. Piropo