Sítio do Piropo

B. Piropo

< Coluna em Fórum PCs >
Volte
20/02/2012

< UEFI: Por que a demora para inicializar? >


Você liga sua máquina e espera até que ela fique pronta para o trabalho e ofereça a tela com os nomes de usuários registrados aguardando que seja fornecida a senha. Há quem faça isto todo o dia e, pior, há quem o faça várias vezes ao dia. Portanto, querendo ou não, estamos todos acostumados a esperar pela inicialização. E, dependendo de certos fatores, esperar um bocado.

Figura 1: dando um “boot” no computador

Mas pergunto: por que a demora? O que faz a máquina enquanto esperamos? E, o mais importante, quanto tempo estamos dispostos a esperar?

Começando pela última pergunta: cada vez menos.

Pete Dice, arquiteto de software do grupo de especialistas em “chipsets” da Intel, em seu artigo < http://fms-staging.eetimes.com/electrical-engineers/education-training/tech-papers/4230439/Boot-Fast-or-Die > “Boot Fast or Die”, afirma: “Como projetista de sistema você pode considerar o iPad da Apple como paradigma moderno no que toca à inicialização. Como a maioria dos sistemas incorporados (‘embedded’), ele não inicializa, apenas liga. É certo que a comparação pode ser injusta já que ele não é baseado em um ‘chipset’ que adota a arquitetura da Intel. Mas, para o usuário, isto pouco importa. Os consumidores esperam que o tempo de resposta seja sempre menor. ...  Mas até que os sistemas similares a Windows e Linux decidam dar a partida sem a ajuda de BIOS ou rotinas de inicialização, nós, como desenvolvedores de sistemas, teremos que adaptar os sistemas atuais baseados em POST a uma nova ordem mundial, adotando  inovações, ou veremos nossos produtos permanecerem nas prateleiras das lojas e, de lá, serem encaminhados diretamente a um museu ainda em sua embalagem original”.

Em outras palavras: o pessoal está ficando impaciente.

Mas, afinal, o que é “rápido”?

Você já considerou o que pode ser classificado como “rápido” ou “lento” em termos de resposta de um dispositivo com o qual as pessoas interagem?

Figura 2: rápido e lento (figura de PhotoSearch)

O próprio Dice, no documento acima citado, informa que dois pesquisadores americanos, independentemente e com quase meio século de intervalo, fizeram alguns experimentos para aferir. E, como prova que adotaram técnicas corretas – embora distintas – e coerentes, chegaram a resultados impressionantemente similares.

O primeiro experimento foi realizado pelo psicólogo Robert Miller nos idos de 1968, muito antes do lançamento do primeiro computador pessoal. O objetivo era estabelecer a forma pela qual o cérebro humano reage a estímulos e como classifica os tempos de resposta. Para isto ele usou os mais modernos computadores da época – aqueles que hoje nós consideramos mastodontes.

Se você se interessar particularmente pelo assunto poderá obter detalhes adquirindo uma cópia do documento com os resultados das pesquisas de Miller na < http://dl.acm.org/citation.cfm?id=1476628 > ACM Digital Library. Aqui vai apenas um resumo dos resultados que nos interessam:

  • Uma resposta obtida em até 200 ms (milissegundos) é considerada imediata pelo usuário;
  • Se a resposta tardar mais de dois segundos, o usuário começa a ficar impaciente;
  • Caso ela venha a demorar mais de quatro segundos, rompe-se a comunicação entre homem e máquina.

Quarenta anos mais tarde, outro psicólogo, Steven Seow, escreveu o livro editado pela Addison-Wesley em 2008, “Designing and Engineering Time: The psychology of time perception in software”, descrevendo, em um de seus capítulos, um experimento similar. A diferença entre ambos os experimentos é que o mais recente utilizava diretamente uma interface gráfica com o usuário em vez de medir o tempo de resposta de simples dispositivos de entrada. Mas é impressionante como, apesar das mudanças significativas na tecnologia dos dispositivos de entrada e saída, os resultados são similares, indicando que o hardware evoluiu mas o cérebro humano não mudou tanto nestas quatro décadas. Seow concluiu que:

  • Uma resposta obtida entre 100 ms e 200 ms (até 100 ms como resultado de se premir uma tecla e até 200 ms como resultado de uma seleção em menu) foi considerada “instantânea”;
  • Se a informação solicitada pelo usuário fosse exibida em um intervalo entre 500 ms e 1 s, a resposta era consideradas “imediata”;
  • Se a máquina levasse de 2 s a 5 s para reagir, a resposta era considerada “contínua”;
  • Finalmente, reações obtidas de 7 s a 10 s eram consideradas “cativas”, ou seja, espelhavam o tempo máximo no qual o usuário manteria a atenção presa à ação esperada, antes de desviá-la para outra tarefa.

Como se vê, estes tempos são muito, muitíssimo inferiores à duração dos procedimentos de inicialização da maioria de nossos computadores.

Mas qual a razão da demora? O que faz a máquina enquanto esperamos?

Por que a demora?

O procedimento de inicialização de um computador pode ser subdividido em etapas. Mas, seja qual for o caso, seu objetivo final é carregar o sistema operacional e pôr a máquina à disposição do usuário, pronta para a labuta.

É claro que uma observação superficial do fenômeno indica uma aparente contradição. Pois quem carrega programas é o Sistema Operacional. Por outro lado, o próprio sistema operacional é um programa. Um programa poderoso, especial, que controla e gerencia a máquina, porém nem por isto deixa de ser um programa. Ora, se quem carrega programas na memória é o sistema operacional e ele mesmo é um programa, como ele foi carregado na memória?

Este assunto já foi discutido aqui mesmo tantas vezes (por exemplo: na coluna < http://blogs.forumpcs.com.br/bpiropo/2007/09/13/computadores-xxxix-o-aparente-misterio-do-boot/ > “O aparente mistério do ‘boot’”) que nem vou me dar ao trabalho de entrar em detalhes. Mas vale a pena, pelo menos, mencionar a razão pela qual ele é conhecido em inglês pelo termo “boot”, que significa “bota”, “botina” e que, aparentemente, nada tem a ver com o assunto.

De fato “boot” quer dizer “botina”, mas em informática ele derivou da simplificação do termo pelo qual o procedimento era conhecido originalmente: “bootstrap”, que significa “cordão da botina”, aqueles cordões utilizados para amarrar as botas. Agora sim ficou claro, pois não?

Figura 3: puxando-se para cima pelos cordões das botas

Acha que não? Ainda não consegue perceber a relação entre os cordões das botinas e o procedimento de inicialização dos computadores? Ah, certamente porque não conhece o ditado em inglês “Pull yourself up by your bootstraps” cuja tradução é “levante-se do chão puxando para cima os cordões das botinas” (como o cavalheiro da Figura 3, obtida no sítio “Enterprise Irregulars”). Ele é usado para indicar que alguém deseja realizar algo que é impossível ser feito com os meios de que dispõe, como o cara que pretende acelerar um barco à vela sentado no banco traseiro segurando um ventilador apontado para a vela. Que, aparentemente, é justamente o que ocorre durante a carga do sistema operacional, que é um programa e precisa de que ele mesmo já esteja carregado para que possa carregar-se a si mesmo, como alguém que tentasse flutuar puxando para cima os cordões das próprias botinas.

Agora, sim, dá para explicar. O ditado deriva de uma das folclóricas mentiras do Barão de Munchausen, interessante personagem que certa feita relatou ter atravessado um pequeno pântano sem molhar as botinas novas apelando para este recurso. E foi como alusão ao ditado que o procedimento de inicialização passou a ser conhecido como “bootstrap” e, mais tarde, acabou simplificado para “boot”. Agora deu para entender, pois não? (uma ocasião, após relatar isto em classe, ouvi um aluno comentar que sempre pensara que o termo derivava do fato de que a máquina passava a se movimentar sozinha ao ser ligada como se, aparentemente, tivesse sido chutada por alguém calçando botinas, uma ideia que me pareceu disparatada até me deparar com a imagem exibida na Figura 1, no início desta coluna, obtida no sítio < http://www.idioms4you.com/index.html > “Idioms4You” ...)

Bem, então vamos lá: como resolver esta aparente contradição?

Simples: para que um programa seja executado, basta que seu código esteja na memória da máquina. Em geral na memória RAM, aquele trecho de memória volátil onde bits são escritos e sobrescritos incessantemente durante o funcionamento da máquina. Mas não necessariamente nela. De fato, estando armazenado em um chip de memória volátil ou não, desde que dentro do espaço de endereçamento da máquina (ou seja, em um trecho de endereços de memória que a máquina pode acessar), qualquer código pode ser executado.

É aí que entra o BIOS.

O BIOS e sua função

BIOS é o acrônimo de “Basic Input and Output System”, ou sistema básico de entrada e saída. Trata-se de um conjunto de rotinas de programação usado pelo sistema operacional para acessar os dispositivos de entrada e saída da máquina. Como cada placa-mãe tem suas peculiaridades, estas rotinas, embora incorporadas ao sistema operacional, precisam respeitar tais peculiaridades e podem ser diferentes de máquina para máquina. Por isto, desde os primeiros computadores pessoais, elas vêm gravadas em um circuito integrado (CI) de memória não volátil que faz parte da própria placa-mãe. Originalmente era um CI do tipo ROM, ou seja, de memória permanente, impossível de ser alterada. Depois passou a ser de memória semipermanente, tipo EPROM ou similar, que podia ser alterado mas exigia para isto equipamentos especiais. Finalmente, nas máquinas modernas, este CI é de memória tipo “flash”, cujo conteúdo pode ser alterado e, portanto, permite atualização das rotinas sem necessidade de ser removido da máquina.

Ora, se a placa-mãe tem que conter um “chip” de memória para as rotinas do BIOS, por que não aproveitá-lo para armazenar também outras rotinas?

Figura 4: Tela de “setup”

E assim foi feito. Quando você liga seu computador e (geralmente) tecla “Del” para entrar no chamado “setup” (conjunto de ajustes do funcionamento da máquina), passa a executar um programa incorporado ao mesmo “chip” de memória que contém o BIOS que permite alterar estes ajustes. Quando a máquina, depois de ligada, faz piscar os leds do teclado, disco rígido e alguns outros dispositivos, está executando uma rotina de testes (chamada POST, acrônimo de “Power On Self Test” ou auto teste de partida), também residente neste CI. E, evidentemente, também neste mesmo CI está gravada a rotina que lê o código do Sistema Operacional (geralmente do disco rígido, mas atualmente este código pode estar em um disco ótico, na rede ou até em um disco de memória tipo “pen-drive”) e o carrega na memória RAM. Este código chama-se “bootloader” ou “carregador da inicialização”.

O mistério, então, está desfeito: quem carrega o sistema operacional é uma rotina de programação especialmente desenvolvida para tal, denominada “bootloader” e gravada no mesmo CI de memória não volátil que contém as rotinas do BIOS e demais rotinas executadas durante a inicialização. CI que, apesar de conter mais que as rotinas do sistema básico de entrada e saída, continua sendo conhecido simplesmente como “o BIOS”.

Mas por que o procedimento demora tanto?

Porque a inicialização de um computador não consiste apenas na carga do sistema operacional na memória RAM.

As etapas da inicialização

Vamos descrevê-la da forma mais sucinta possível para que possamos entender as razões da demora.

Assim que a máquina é ligada, o processador (que obedece a arquitetura Intel, como praticamente todos os usados nos nossos micros) “aponta” seu ponteiro de instruções para endereço mais alto da memória. O CI que contém este endereço, como você já deve ter adivinhado, é justamente o mesmo que contém o BIOS. Neste endereço há uma instrução, em linguagem de máquina, naturalmente, que desvia o fluxo do programa para uma rotina de testes denominada POST, o nosso já citado auto teste de partida, durante o qual todo o hardware é testado (lhe parece perda de tempo testar todo o hardware cada vez que a máquina é ligada? Talvez porque você não tenha se dado conta do fato de que, enquanto ela estava desligada, o usuário pode ter acrescentado ou removido um dispositivo como por exemplo um disco rígido...) Durante o teste, algumas mensagens aparecem na tela dando conta de seu progresso, dos dispositivos encontrados e seu estado (veja figura).

Figura 5: Tela mostrando o progresso do POST

Terminado o teste de hardware e tudo estando nos conformes (se não estiver, a rotina é interrompida e aparece uma mensagem de erro na tela), a máquina passa a transcrever na memória RAM um conjunto de tabelas que contêm endereços das chamadas “rotinas de interrupção” para que o sistema saiba onde encontra-las quando precisar delas. Tudo isto é feito sem qualquer concurso do sistema operacional, que ainda não foi carregado.

Testado o hardware,  carregadas na memória as tabelas de interrupção e executadas mais algumas tarefas preparatórias que não vale a pena mencionar, então – e somente então – o controle é passado para o “bootloader”, a rotina que, afinal, carregará o sistema operacional.

O primeiro passo desta rotina é consultar os ajustes do “setup” (que estão armazenados no mesmo CI) para verificar de onde o usuário deseja que o SO seja carregado desta vez (em geral é do disco rígido, mas isto pode ser alterado, como sabemos). Isto feito, a rotina de carga vai até o dispositivo de armazenamento escolhido pelo usuário, procura os arquivos que contêm as rotinas que, juntas, constituem o sistema operacional, as carrega na memória e passa o controle para elas.

Somente então o sistema operacional se assenhora da máquina, efetua as derradeiras preparações (como carga dos “serviços” e programas residentes que permanecem em segundo plano) e, afinal, se põe à disposição para a labuta.

É por isto que demora tanto.

Mas, considerando o comentário de Pete Dice citado lá no início da coluna, algo tem que ser feito para reduzir este tempo – e reduzir drasticamente – para que os computadores não sejam “encaminhados diretamente a um museu ainda em sua embalagem original”.

É aí que entra o padrão UEFI.

Que começaremos a destrinchar na próxima coluna.

Até lá.

 


B. Piropo