Micro Cosmo
Volte
20/11/95

< E Foi Dada a Partida>


Para executar um programa é preciso “carregá-lo” na memória e “apontar” o ponteiro de instruções (os registradores CS e IP) para a sua primeira instrução. Depois, à medida que cada instrução vai sendo executada, o ponteiro de instruções é reajustado para a próxima automaticamente (seja simplesmente se ajustando para o endereço imediatamente superior, seja saltando em zig-zag para endereços na ordem determinada pelas instruções do próprio programa que está sendo executado) e o programa prossegue.

Sabemos também que o conjunto de instruções que compõem o programa geralmente está gravado em disco, sob a forma de um arquivo executável (“executável” justamente por conter instruções que serão executadas; por essa razão, em geral esses arquivos têm extensão Exe). Portanto, “carregar” um programa consiste em ler no disco um arquivo executável, copiar seu conteúdo para a memória e escrever nos registros CS e IP o endereço da posição de memória onde foi copiada a primeira instrução (na verdade o processo é um pouquinho mais complicado, mas essencialmente é isso aí).

Isso é necessário porque a memória RAM, onde são copiadas as instruções do programa, é volátil (ou seja: “esquece” os dados quando se desliga a máquina). Mas existe um tipo de memória permanente, a memória ROM. Ela é lenta, cara, pouco flexível porque seu conteúdo não pode ser alterado, mas preserva os dados mesmo quando não alimentada com energia. Portanto, se um programa estiver gravado em um chip de memória ROM, não será preciso copiá-lo para a memória na ocasião de ser executado, pois ele já estará lá. É verdade que jamais poderá ser alterado (a não ser, é claro, trocando o chip onde vem gravado), mas afinal, no caso que nos interessa, todo o que ele precisa fazer é acordar a máquina de seu torpor e dar início ao processo de “partida à frio” (ou “cold boot”, aquela que é dada ao se ligar a máquina; contrapondo-se à “partida à quente”, ou “warm boot”, executada ao se premir simultaneamente as teclas Ctrl, Alt e Del). Pois a máquina é sempre a mesma e pode ser “acordada” sempre do mesmo jeito. E mais: ele nem precisa ser muito grande, pois basta que dê início ao processo, já que o resto pode ser feito por um programa lido do disco e carregado na memória RAM (carregado por quem? Ora, pelo próprio programa gravado em ROM).

Resta o problema de “apontar” os registradores CS e IP para a primeira instrução desse programa gravado em ROM. Como fazê-lo no momento em que se liga a máquina?

Bem, se você tem um canhão e precisa atingir um alvo, pode fazê-lo de duas maneiras. Uma delas, a mais comum, é girar o canhão e ajustá-lo até que ele aponte exatamente para o alvo. Mas, em tese, nada impede que você deixe o canhão como está e mova o alvo até que ele fique exatamente na posição para a qual aponta o canhão.

Sua máquina, na partida à frio, usa este último método. E faz isso devido a uma característica da própria CPU. Pois assim que recebe energia, toda a CPU compatível (ou seja, capaz de rodar os mesmos programas) com o velho 8088 que equipava o primeiro PC, tem todos os dezesseis bits do registrador CS “setados” (ou seja, preenchidos com o dígito um) e todos dezesseis os bits do registrador IP “resetados” (ou seja, preenchidos com zero). Em suma, quando uma dessas CPUs é energizada, seu ponteiro de instruções aponta sempre para o mesmo endereço. E se, na memória (seja ela RAM ou ROM), houver um programa iniciando nesse endereço, ele será executado. Sua máquina, evidentemente, coloca a primeira instrução do programa usado na partida à frio justamente ali.

Um detalhe não essencial, mas interessante: se quiser, você pode calcular esse endereço (multiplicando o conteúdo de CS por dezesseis e somando o resultado ao conteúdo de IP, como já vimos) e descobrir que ele se situa exatamente dezesseis posições de memória abaixo do endereço 1 Mb. E para quem estranhou que fique tão próximo do final do primeiro megabyte de memória, o máximo que o velho PC podia reconhecer: o programa começa nesse endereço, mas não se desenvolve seqüencialmente a partir dele. Sua primeira instrução é um “jump”, ou seja, uma instrução que modifica o fluxo do programa carregando no ponteiro de instruções um novo endereço e fazendo o fluxo saltar para lá, de onde o programa efetivamente se desenvolve.

Pronto: foi desfeito o mistério. Não é preciso “carregar” o programa responsável pela partida à frio porque ele vem armazenado em um chip de memória ROM (e que, portanto, preserva seu conteúdo mesmo com a máquina desligada) cujo endereço inicial corresponde ao endereço para o qual o ponteiro de instruções da CPU de sua máquina “aponta” automaticamente tão logo ela é ligada. Desencadeado o processo, ele prossegue automaticamente rodando o programa gravado em ROM.

E o que faz esse programa? Bem, sua primeira atividade é um interessante procedimento chamado POST. Nosso assunto da semana que vem.

B. Piropo