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

< Bug do ano 2000 IV: >
< o Relógio do PC >


Como vimos semana passada, ao discutirmos os efeitos do bug do ano 2000 sobre nossos micros pessoais, temos que levar em conta três aspectos relativos à data: aquela gerenciada pelo RTC (o relógio interno, ou "Real Time Clock"), a mantida pelo sistema operacional e a processada pelos programas.

Primeiro, vejamos o RTC. Essencialmente, ele é igual a qualquer destes relógios digitais comuns. Porém, ao invés de exibir data e hora no mostrador, guarda os dados em um chip de memória tipo CMOS. A maioria dos dados referentes à data são armazenados na memória CMOS no formato decimal codificado em binário (Binary Coded Decimal, ou BCD), no qual os algarismos decimais de zero a nove são convertidos para o formato binário. Como o número nove, correspondente ao maior algarismo decimal, é expresso em binário por "1001", são necessários quatro bits (meio byte, ou um "nibble") para codificar cada algarismo. Assim, em cada byte da memória CMOS podem ser armazenados dois algarismos do ano. Logo, para armazenar os quatro algarismos do ano corrente, são usadas duas posições da memória CMOS. Uma delas guarda os dois algarismos finais, correspondentes às dezenas e unidades. A outra, os dois algarismos iniciais, correspondentes aos milhares e às centenas.

Um das causas do bug do ano 2000 é a forma pela qual a posição de memória que armazena os dois algarismos iniciais do ano é tratada pelo sistema. Primeiro, porque nas máquinas mais antigas a rotina do BIOS que atualiza a data simplesmente a ignora e jamais a altera, ou seja, age como se o século fosse imutável (BIOS é a parte do sistema operacional que lida diretamente com o hardware, e que nos micros pessoais vem gravada em um chip de memória ROM integrado à placa-mãe). Nestes sistemas, na passagem de 31/10/99 para 01/01/2000, a atualização do ano se resumirá aos seus dois últimos algarismos e ele será ajustado para 1900. Em máquinas como estas, uma possível solução seria ajustar manualmente o ano 2000. Mas há casos piores: em sistemas mais antigos os dois algarismos iniciais são "hard coded", ou seja, gravados diretamente no hardware e simplesmente não podem ser alterados nem manualmente nem por rotinas de programação desenvolvidas para este fim.

Mas não é só isso. Há também o modo pelo qual a passagem do tempo é "contabilizada" nas máquinas da linha PC. Para entender as razões disso, há que lembrar que ela foi lançada em 1981 pela IBM e que o RTC destina-se exclusivamente a atualizar a data corrente enquanto o micro está desligado (a partir do momento em que ele é ligado, assuntos ligados a data e hora correm por conta do sistema operacional). Sendo então a memória CMOS concebida apenas para conter a data corrente, jamais poderia registrar uma data anterior ao lançamento da linha. Por essa razão os programadores que desenvolveram as rotinas do BIOS fixaram a data de 01/01/1980 como "origem dos tempos" (voltaremos ao assunto quando discutirmos os aspectos relativos ao sistema operacional). O resultado disto é que os BIOS mais antigos não aceitam como data atual nenhuma data anterior a 01/01/1980. Qualquer tentativa é considerada um erro de digitação, rejeitada pelo BIOS e a data corrente é ajustada para 01/01/1980, a mais antiga suportada pelo sistema. Em máquinas deste tipo, na virada do ano o "19" inicial não será alterado. Quando a ele for acrescentado o "00" final (que sucede ao "99" de 1999) o resultado será 1900. Como este valor é anterior à "origem dos tempos", a data será rejeitada e ano será ajustado para 1980. Em máquinas assim, a memória CMOS jamais registrará o ano 2000.

Portanto, no que toca ao RTC, podem surgir três tipos de problema na virada do ano: 1) os algarismos "1" e "9" correspondentes aos dois primeiros dígitos do ano não podem ser alterados porque são gravados no hardware; 2) eles podem ser alterados, mas a rotina do BIOS responsável pela manutenção da data não inclui sua atualização (em ambos os casos o ano será ajustado para 1900); 3) alguns BIOS, ao interpretar o "00" final como 1900, rejeitarão o valor do ano por ser anterior a 1980 (e neste caso o ano será ajustado para 1980).

Semana que vem começaremos a examinar os aspectos relativos ao sistema operacional.

B. Piropo