Escritos
B. Piropo
Anteriores:
< Trilha Zero >
Volte de onde veio
09/08/1999

< Bug do ano 2000 V: >
< o Relógio do Sistema Operacional >


Semana passada discutimos o relógio interno do PC. Que serve apenas para manter atualizadas a data e a hora durante os períodos em que o micro permanece desligado, pois a partir do momento em que se liga a máquina, esta função passa a ser desempenhada pelo sistema operacional. Para entendermos como isto é feito, tomemos o velho DOS como modelo, não apenas por ser um bom exemplo como também porque isso lançará mais alguma luz sobre o problema do bug do ano 2000.

Durante sua inicialização, o DOS executa alguns preparativos que incluem a determinação de certos dados e seu armazenamento em um trecho da memória denominado BDA (BIOS Data Area, ou "área de dados do BIOS"), um conjunto de 255 bytes usado como "bloco de anotações" pelo sistema. Um destes procedimentos é justamente consultar o relógio interno e anotar os dados correspondentes à data e a hora correntes em determinados endereços da BDA. A partir daí, enquanto o micro estiver ligado, o sistema manterá por sua própria conta os valores de data e hora do BDA escrupulosamente atualizados para, quando solicitado, fornecê-los a quem os solicitou. Ora, como a BDA é pequena e a quantidade de dados a ser armazenada é grande, data e hora correntes devem ocupar o menor espaço possível. O artifício engendrado pelos programadores do DOS para economizar memória foi engenhoso e resultou no uso de apenas seis bytes, quatro para a hora e dois para a data. A hora é armazenada nos seus quatro bytes sob a forma de intervalos de tempo (de exatos 0,055 segundos) decorridos desde a meia noite e a data é armazenada em dois bytes sob a forma de número de dias decorridos desde 01/01/1980, a "origem dos tempos" do DOS.

Para atualizar estes valores, o DOS recorre a um mecanismo próprio para contar o tempo. Este mecanismo se baseia em um oscilador (o chip 8254 da Intel ou compatível) que emite um pulso exatamente a cada 55 milésimos de segundo. Cada pulso gera uma interrupção (mais especificamente a Int 08) cuja função é somar uma unidade ao número contido nos quatro bytes usados para guardar a hora na BDA. Quando um programa solicita a hora corrente, o DOS simplesmente lê este número, divide por 5,5 para obter os centésimos de segundos decorridos desde a meia noite, converte o resultado em horas, minutos, segundos e centésimos de segundos e fornece ao programa. E quando o número que representa o tempo decorrido desde à meia noite atinge exatamente 24 horas, seu valor volta a zero e o número contido nos dois bytes que armazenam a data é incrementado de uma unidade. Quando solicitado a fornecer a data, o DOS lê este último número e converte o resultado para dia, mês e ano simplesmente fazendo as contas a partir de sua origem dos tempos, o dia 01/01/1980 (o sistema tem rotinas internas para isto). Uma técnica elaborada, mas que funciona. Pelo menos funcionará até 2099, o maior valor aceito pelo DOS para ano (portanto, se você espera usar o DOS por mais cem anos, prepare-se para o bug do ano 2100).

Este procedimento, comum ao Windows 3.x e a versões antigas de Windows 95, pode ser um problema na virada do ano, já que o ano 2000 pode ser interpretado como 1900 e recusado por ser anterior a 1980. Máquinas com estas versões do DOS, ao serem ligadas após janeiro do ano que vem, atualizarão a data como 01/01/1980. Windows NT 3.x reconhece datas anteriores a 1980, mas também não atualiza os dois dígitos iniciais do ano. Portanto, o ano 2000 será interpretado como 1900. Windows 98 não apresenta este problema (mas apresenta outros, o que obrigou a MS a colocar um "patch" à disposição dos usuários; adiante voltaremos ao assunto). Windows NT 4.0 será capaz de detectar que o ano de 1900 não é válido (mesmo nas máquinas cujo BIOS não atualizar os dois primeiros dígitos do ano armazenados na memória CMOS) e exibirá corretamente o ano 2000.

PS: Recentemente, em férias no exterior, recorri ao ICQ para me comunicar com o Brasil. Sem tempo para recorrer ao manual (tá bom: sem vontade; afinal, eu estava de férias...) volta e meia eu me enrolava todo. Até descobrir a página da Fátima Conti, em [http://www.ufpa.br/dicas/icqdicas.html]. Se, como eu, você é um usuário bissexto do ICQ e deseja respostas rápidas para perguntas elementares sobre o programa, procure por lá.

B. Piropo