Setup da BIOS de um PC
BIOS
O BIOS (um acrônimo de Basic Input/Output System, em português Sistema Básico de Entrada/Saída, e também conhecido como System BIOS, ROM BIOS ou PC BIOS) é um firmware não-volátil usado para realizar a inicialização do hardware durante o processo de inicialização (por meio do botão de inicialização da máquina) e para fornecer serviços de tempo de execução para sistemas operacionais e programas. O firmware BIOS vem pré-instalado na memória permanente da placa mãe do computador e é o primeiro software a ser executado quando se liga a máquina. O nome origina do Sistema Básico de Entrada/Saída usado no sistema operacional CP/M em 1975. Originalmente proprietário da IBM PC, o BIOS passou por engenharia reversa por empresas que buscam criar sistemas compatíveis. A interface deste sistema original serve como um padrão de fato.
O BIOS, em PCs modernos, inicializa e testa os componentes de hardware do sistema e carrega um carregador de inicialização de um dispositivo de memória em massa, o qual inicializa um sistema operacional. Na era do MS-DOS, a BIOS fornecia uma camada de abstração de hardware para o teclado, monitor e outros dispositivos de entrada/saída (E/S) que padronizaram uma interface para programas aplicativos e para o sistema operacional. Sistemas operacionais mais recentes não usam a BIOS após a carga, acessando, em vez disso, os componentes de hardware diretamente.
A maioria das implementações da BIOS são especificamente projetadas para trabalhar com um computador ou modelo de placa mãe particular, por meio da interface com vários dispositivos que compõem o chipset do sistema complementar. Originalmente, o firmware BIOS era armazenado em um chip ROM na placa mãe do PC. Em sistemas de computador modernos, os conteúdos do BIOS são armazenados em memória flash, desta forma ele pode ser reescrito sem remover o chip da placa mãe. Isto permite fácil atualização do firmware BIOS pelo usuário final, desta forma novos recursos podem ser adicionados ou falhas podem ser corrigidas, mas também cria uma possibilidade para o computador ser infectado com rootkits de BIOS. Além disso, uma atualização de BIOS que falha pode bloquear a placa mãe permanentemente, a menos que o sistema inclua alguma forma de backup para este caso.
CMOS
CMOS (complementary metal-oxide-semiconductor, em português semicondutor de metal-óxido complementar) é uma tecnologia empregada na fabricação de circuitos integrados, englobando elementos de lógica digital (portas lógicas, flip-flops, contadores, decodificadores, etc.), microprocessadores, microcontroladores, memórias RAM, etc. A tecnologia do CMOS é também utilizada para produção de circuitos analógicos como sensores de imagem, conversores de sinal e transceptores, utilizados largamente na comunicação. O CMOS foi patenteado em 1963 por Frank Wanlass.
O “complementary” em seu nome vem do fato dessa tecnologia utilizar os dois tipos de transistores MOSFET, o MOSFET canal N e o MOSFET canal P, de tal modo que um deles “complementa” o outro na necessidade de se produzir funções lógicas.
A CMOS é hoje a tecnologia mais largamente usada na fabricação de CIs. As principais vantagens dos circuitos integrados CMOS são o baixíssimo consumo de energia (que leva à baixa dissipação de calor) e a possibilidade de alta densidade de integração, em comparação com outras tecnologias, e.g. TTL. Outro ponto a destacar é a boa relação sinal-ruído devido à baixa interferência dos sinais eletrônicos. Devido a tais características, circuitos CMOS são também largamente utilizados em calculadoras, relógios digitais, e outros dispositivos alimentados por pequenas baterias, bem como uma importante opção para tradutores de sinais luminosos. Apesar dessas vantagens do CMOS, ele continua sendo mais lento que o TTL.
No jargão dos computadores, é comum usar o termo “CMOS” para se referir a uma determinada área de memória, onde ficam guardadas informações sobre os periféricos instalados e a configuração inicial do computador, além do relógio e calendário. Como a memória e o relógio precisam ser preservados mesmo com o computador desligado, são alimentados por uma pequena bateria de lítio, e somente a tecnologia CMOS pode produzir dispositivos com um consumo baixo o suficiente para esse propósito. A memória e relógio estão embutidos em um circuito integrado fabricado com tecnologia CMOS, levando ao uso equivocado do nome.
BIOS de memória não-volátil, mais conhecido como ROM-CMOS, refere-se à memória na placa-mãe de um computador pessoal que contém o sistema BIOS Basic Input Output System, responsável pelas configurações básicas de entrada e saída, e às vezes, o código usado para inicializar o computador e carregar o sistema operacional. A memória não-volátil, historicamente, era denominada CMOS-ROM ou apenas CMOS porque tradicionalmente usava um chip de memória CMOS de baixo consumo (o Motorola MC146818 ou um de seus clones de alta capacidade), o qual era alimentado por uma pequena bateria quando a energia do sistema era desligada. O termo permanece em uso corrente neste contexto, embora seja considerado equivocado. O BIOS não-volátil em computadores modernos pode ser armazenado em chips EEPROM ou de memória flash e não mais em CMOS. Nestes casos, a bateria de backup é usada para manter o chip do RTC sincronizado. A NVRAM normalmente possui uma capacidade de armazenamento de 512 bytes, a qual é suficiente para todas as configurações do BIOS.
Bateria da Placa Mãe
A memória e o relógio de tempo real são alimentados geralmente por uma bateria-moeda CR2032 de lítio. Estas baterias duram de dois a dez anos, dependendo do tipo de placa-mãe, temperatura ambiente e do tempo que o sistema ficou desligado, enquanto outros tipos comuns de baterias podem durar períodos significativamente maiores ou menores, tais como a CR2016, capaz de durar cerca de 40% a mais. Temperaturas mais altas e períodos maiores com o computador desligado diminuem a vida útil da bateria. Ao substituir a bateria, a hora e data do sistema e as configurações do BIOS CMOS podem voltar aos seus valores-padrão. Isto pode ser evitado substituindo-se a bateria após o computador ter sido desligado por software (ou seja, sem desligar no botão de força), mas ainda conectado na tomada. Em placas-mãe ATX, isso irá fornecer 5V de energia stand-by mesmo com o computador aparentemente “desligado” e manterá a memória CMOS energizada.
Resetando as configurações do CMOS
Para acessar o BIOS Setup quando a máquina deixa de funcionar, ocasionalmente é necessário tomar uma atitude drástica. Em computadores antigos, com RAM alimentada por bateria, remover a bateria e dar um curto-circuito nos terminais da mesma durante alguns segundos resolvia o problema; em máquinas mais modernas, isso apenas reinicializa o RTC. Algumas placas-mães oferecem um jumper de reset de CMOS. Em outros casos, o chip EEPROM tem de ser dessoldado e os dados nele contidos têm de ser editados manualmente usando um programador. Às vezes, basta aterrar a linha CLK ou DTA do barramento I²C da EEPROM no momento certo durante o boot; todavia, isso exige conhecimento preciso de soldagem de componentes em montagem superficial. Se a máquina permite fazer o boot mas não que se entre no BIOS Setup, pode ser tentado “danificar” deliberadamente a verificação de soma do CMOS, fazendo-se escritas diretas na área protegida da ROM CMOS através de um utilitário como o debug.exe, o que corromperá os dados. No próximo boot, o computador geralmente assume os valores-padrão de fábrica.
POST
O power-on self-test (POST), em tradução livre autoteste de inicialização, é um processo realizado pelas rotinas de firmware ou software imediatamente após um computador ou outro dispositivo eletrônico digital ser ligado. Consiste basicamente em uma sequência de testes ao hardware, realizada pelo BIOS, responsável por verificar, preliminarmente, se o sistema se encontra em estado operacional. Se for detectado algum problema durante o POST a BIOS emite uma certa sequência de bipes sonoros, que podem mudar de acordo com o fabricante da placa-mãe. É o primeiro passo de um processo mais abrangente designado Initial Program Load (IPL), booting ou bootstrapping.
Aqui tratamos principalmente de POSTs em computadores pessoais, mas muitos outros sistemas embarcados, como os dos principais dispositivos, aviônicos, comunicações ou equipamentos médicos, também possuem rotinas de autoteste que são automaticamente invocadas na inicialização.
Os resultados do POST podem ser exibidos em um painel que faz parte do dispositivo, enviados para um dispositivo externo ou armazenados para recuperação futura por uma ferramenta de diagnóstico. Uma vez que um autoteste pode detectar que a tela normal de leitura humana do sistema não esteja funcionando, pode ser fornecida uma lâmpada indicadora ou um alto-falante para mostrar os códigos de erro como uma sequência de flashes ou bipes. Além de executar testes, o processo POST também pode definir o estado inicial do dispositivo a partir do firmware.
No caso de um computador, as rotinas do POST fazem parte da sequência de pré-inicialização de um dispositivo. Se eles forem concluídos com êxito, o código do carregador de inicialização será chamado para carregar um sistema operacional.
Inicialização do Computador
Os procedimentos a seguir constituem uma seqüência de execução típica:
- A fonte de força interna é ligada e inicia. A fonte de força leva algum tempo até ser capaz de gerar energia estável para o resto do computador. Então o chipset gera um sinal de reset para o processador até que ele receba um sinal de energia estável da fonte de força.
- Quando o sinal de reset cessa, o processador está pronto para executar. O processador é pré-programado para acessar primeiramente a ROM e executar o BIOS.
- O BIOS executa o POST. Caso ocorra algum erro fatal em algum teste do POST, o processo de BOOT pára. O POST emite códigos sonoros ou luzes no painel frontal do gabinete para identificar o erro.
- O BIOS executa outros BIOS de outros dispositivos (ex., placa de vídeo, HD SCSI).
- Caso o BIOS suporte o padrão Plug and Play, ele detecta e configura todos os dispositivos Plug and Play.
- O BIOS exibe uma tela de sumário mostrando a configuração do sistema. Ela é difícil de ser lida porque muitas vezes é mostrada no monitor muito rapidamente.
- O BIOS procura o dispositivo de BOOT, de acordo com a seqüência de BOOT armazenada no CMOS. CMOS é um pequena memória RAM que armazena informações de configuração de hardware. Exemplo de sequência de BOOT: USB, CD-ROM, HD e placa de rede.
- Tendo identificado o dispositivo de BOOT (dispositivo que contém o sistema operacional), o BIOS procura pelas informações de BOOT, para que o carregamento do sistema operacional possa começar.
- O BIOS procura pelo MBR (Master Boot Record) no cilindro zero, cabeça zero e setor um (o primeiro setor do disco). Caso o BOOT seja pela USB,ela também procura pelo volume BOOT (similar ao MBR do HD).
- O BIOS inicia o processo de carregamento do sistema operacional para a memória RAM utilizando as informações contidas no setor de BOOT. A partir deste ponto as instruções contidas no setor de BOOT passam a comandar o PC. Caso nenhuma informação seja encontrada no setor do primeiro dispositivo da seqüência de BOOT, tenta-se o segundo dispositivo e assim consecutivamente até que as intruções para o carregamento do sistema operacional sejam encontradas.
Atualização ou Upgrade
Na maioria das placas mãe modernas o BIOS pode ser atualizado, e os fabricantes disponibilizam arquivos para essa finalidade. A atualização pode resolver problemas de funcionamento de periféricos, ou mesmo erros da versão anterior do BIOS. A atualização altera três programas que estão dentro da memória ROM (BIOS, POST, Setup) e é uma operação de risco e requer muito cuidado para não haver danos na placa-mãe.
Há vários problemas que podem acontecer nas atualizações, alguns deles são: arquivos corrompidos, falta de informações para a solicitação do software correto, ou ainda a falta de energia elétrica. Se ocorrer algum problema o sistema poderá não iniciar, deixando a placa-mãe muitas vezes inoperante.
A atualização ou o upgrade do chip somente deve ser feito quando for realmente necessário.
Os principais fabricantes deste firmware são: American Megatrends (AMI), Award, General Software, Insyde Software, e Phoenix Technologies.
As BIOS geralmente são de código fechado e isso pode causar alguns problemas para quem se preocupa com a segurança do computador ou quer trocar sua placa wifi para outra de marca diferente (que geralmente a BIOS bloqueia). Para isso, existe o projeto libreboot, que permite a substituição de uma BIOS privativa por uma implementação de uma BIOS livre para alguns servidores, desktops e notebooks.
UEFI
O Unified Extensible Firmware Interface (UEFI), em português Interface Unificada de Firmware Extensível, é uma especificação que define uma interface de software entre o sistema operacional e o firmware da plataforma. UEFI pretende substituir a interface de firmware do Sistema de Entrada/Saída Básico (BIOS), presente em todos os computadores pessoais compatíveis com o IBM PC. Na prática, a maioria das imagens UEFI fornecem suporte legado para os serviços do BIOS. UEFI pode suportar diagnósticos remotos e reparação de computadores, mesmo sem outro sistema operacional instalado.
A especificação original EFI (Extensible Firmware Interface) foi desenvolvida pela Intel. Algumas de suas práticas e formatos de dados espelham aqueles do Windows. Em 2005, a UEFI tornou a EFI 1.10 (versão final do EFI) obsoleta. A especificação da UEFI é gerenciada pelo Unified EFI Forum.
A interface definida pela especificação EFI inclui tabelas de dados que contêm informações de plataforma e serviços de inicialização e tempo de execução que estão disponíveis para o carregador do sistema operacional e para o sistema operacional. O firmware UEFI oferece várias vantagens técnicas sobre um sistema tradicional de BIOS:
- Capacidade de usar discos grandes (mais de 2 TB) com uma tabela de partição GUID (GPT)
- Arquitetura independente de CPU
- Drivers independentes de CPU
- Ambiente pré-SO flexível, incluindo capacidade de rede
- Design modular
- Compatibilidade reversa e futura
Recursos
As interfaces definidas pela EFI incluem tabelas de dados que contem informação sobre a plataforma, e serviços de boot e runtime que ficam disponíveis para o carregador do SO e o próprio SO.
Alguns melhoramentos para BIOS PC, como o ACPI e o SMBIOS, também estão presentes no EFI, já que eles não dependem de uma interface em tempo de execução de 16-bit.
Secure boot
A especificação UEFI 2.3.1 Errata C (ou superior) define um protocolo conhecido como secure boot (em português inicialização segura), que pode tornar o processo de inicialização seguro por meio da prevenção de carregamento de drivers ou carregadores de SO que não são assinados com uma assinatura digital aceitável. Os detalhes mecânicos de como, precisamente estes drivers são assinados não são especificados.
Compatibility Support Module
O Compatibility Support Module (CSM), em português Módulo de Suporte à Compatibilidade, é um componente do firmware UEFI que fornece compatibilidade legada do BIOS por meio da emulação de um ambiente BIOS, permitindo que sistemas operacionais legados e algumas option ROMs que não suportam UEFI ainda sejam usados.
Serviços
O EFI define boot services, que incluem suporte a consoles de texto e gráficos em vários dispositivos, barramentos, serviços de bloco e de arquivos, e runtime services, assim como data, hora e serviços NVRAM.
Drivers de dispositivo
Em adição aos drivers de dispositivos padrões específicos da arquitetura, a especificação EFI provê para um ambiente de drivers de dispositivo independente do processador, chamado EFI Byte Code ou EBC.
Alguns tipos de drivers de dispositivo (não EBC) específicos para a arquitetura podem ter interfaces para uso pelo sistema operacional. Isso permite ao SO confiar ao EFI o suporte básico aos gráficos e à rede enquanto os drivers específicos são carregados.
Gerenciador de boot
Um Gerenciador de boot EFI é também usado para selecionar e carregar o sistema operacional, removendo a necessidade de um mecanismo de boot loader (o boot loader do SO é uma aplicação EFI).
Suporte a Disco
Em adição ao esquema de partição do PC padrão, Master boot record (MBR), o EFI adiciona suporte para uma tabela de partição GUID, que não sofre das mesmas limitações. A especificação EFI não inclui um descrição para um sistema de arquivos; implementações da EFI tipicamente suportam FAT32 como seus sistemas de arquivos
O Shell EFI
A comunidade EFI criou um Shell open source; ao invés de “bootar” diretamente em um SO completo, em algumas implementações, o usuário pode dar boot no shell EFI. O shell é uma aplicação EFI; ele pode residir diretamente dentro da ROM da plataforma, ou num dispositivo para o qual os drivers estão na ROM.
O Shell pode ser usado para executar outras aplicações EFI, como setup, a instalação do SO, utilitários de diagnóstico ou configuração, e atualizações da flash do sistema; ele pode também ser usado para tocar CDs ou DVDs sem ter que iniciar um sistema operacional completo, contanto que uma aplicação EFI com as características apropriadas seja escrita. Os comandos do shell tornam possível copiar ou mover arquivos e pastas entre os sistemas de arquivos suportado. Drivers podem ser carregados e descarregados, e um stack TCP/IP completo pode ser usado de dentro do shell.
O shell EFI suporta encriptação através de arquivos .nsh, que são análogos aos arquivos batch do DOS
Nomes de comandos do shell são frequentemente herdados do interpretador de comandos do DOS ou o shell Unix. O shell pode ser visto como um substituto funcional para o interpretador de comandos do DOS.
Extensões
Extensões ao EFI podem ser carregadas de virtualmente qualquer dispositivo de armazenamento não volátil ligado ao computador. Por exemplo, um OEM pode vender sistemas com uma partição EFI em um HD que adicionariam características adicionais para o firmware EFI padrão armazenado na ROM da placa mãe.
A partir daqui não será cobrado em prova. É apenas para os alunos que querem aprender mais e ir além.
Coreboot
O coreboot, anteriormente conhecido como LinuxBIOS, é um projeto em software livre que visa substituir firmware proprietário (BIOS ou UEFI) encontrado na maioria dos computadores com um firmware leve projetado para executar apenas o número mínimo de tarefas necessárias para carregar e executar um moderno sistema operacional de 32 bits ou 64 bits. Desde coreboot inicializa o hardware direto, é portado para cada chipset e placa-mãe que ele suporta. Como resultado, coreboot está disponível apenas para um número limitado de plataformas de hardware e modelos de placas-mãe. Uma das variantes Coreboot é Libreboot.
História
O projeto coreboot começou no inverno de 1999 no Laboratório de Computação Avançada em Laboratório Nacional de Los Alamos (LANL), com o objetivo de criar uma BIOS que iria inicializar rápido e tratar os erros de forma inteligente. É licenciado sob os termos da GNU General Public License (GPL). Principais contribuintes incluem LANL, SiS, AMD, Coresystems e Linux Networx, Inc, bem como fornecedores de placas-mães MSI, Gigabyte e Tyan, que oferecem coreboot ao lado de sua BIOS padrão ou fornecer as especificações dos interfaces de hardware para algumas das suas placas-mães. Google parcialmente patrocinou o projeto coreboot. CME Group, um grupo de bolsas de futuros, começou a apoiar o projeto coreboot em 2009.
Coreboot foi aceito nos sete anos consecutivos (2007-2014) para o Google Summer of Code. Além dos três primeiros modelos, todos os Chromebooks executam Coreboot. O código do Das U-Boot foi assimilado para ativar o suporte para processadores baseados no conjunto de instruções ARM.
As plataformas suportadas
Arquiteturas de CPU suportadas pelo coreboot incluem IA-32, x86-64, ARM, ARM64, MIPS e RISC-V. Suportado system-on-a-chip (SOC) plataformas incluem AMD Geode, começando com o processador Geode GX desenvolvido para o OLPC. Artec Group adicionou suporte Geode LX para a sua ThinCan modelo DBE61; que o código foi adotado pela AMD e melhorado para o OLPC depois que foi atualizado para a plataforma Geode LX, e é desenvolvido pela comunidade coreboot para suportar outras variantes Geode. Coreboot pode ser flashear em uma plataforma Geode usando Flashrom.
A partir desse desenvolvimento inicial em plataformas baseadas AMD Geode, suporte coreboot foi estendido para muitos processadores e chipsets AMD. A lista inclui processador Família 0Fh e 10h (core K8), e recentemente família 14h (núcleo Bobcat, Fusion APU). Suporte Coreboot também se estende aos chipsets AMD: RS690, RS7xx, SB600, e SB8xx.
AMD Generic Encapsulated Software Architecture (AGESA) – uma inicialização de protocolo pelo qual os dispositivos do sistema das placas-mâes AMD64 estão initializando – era código aberto no início de 2011, com o objetivo de fornecer a funcionalidade necessária para a inicialização do sistema coreboot em hardware AMD64.
Dispositivos pré-carregados com Coreboot ou um de seus derivados incluem Chromebooks baseados em x86, Libreboot X200 e T400 (rebatizado Thinkpad X200 e T400, respectivamente, disponível a partir da Minifree, anteriormente conhecido como Gluglug), OLPC XO da iniciativa One Laptop per Child e ThinCan modelos DBE61, DBE62 e DBE63.
Projeto
Coreboot normalmente carrega um kernel Linux, mas pode carregar qualquer outro executável ELF stand-alone, como iPXE, gPXE ou Etherboot que pode inicializar um kernel Linux através de uma rede, ou SeaBIOS que podem carregar um kernel Linux, Microsoft Windows 2000 e posterior, e BSDs (anteriormente, o Windows 2000/XP e suporte a OpenBSD foi fornecida por ADLO). Coreboot também pode carregar um kernel a partir de qualquer dispositivo compatível, como Myrinet, Quadrics, ou interconexões SCI de cluster. Iniciando outros kernels diretamente também é possível, como o kernel do Plan 9. Em vez de carregar um kernel diretamente, coreboot pode passar o controle para um carregador de inicialização dedicado, como uma versão compativel com coreboot o GNU GRUB 2.
Coreboot é escrito principalmente em C, com uma pequena quantidade de código em assembly. Escolhendo C como linguagem de programação principal por ser fácil auditar o código, o que resulta em maior segurança. O código fonte é liberado sob a licença GNU GPL versão 2.
Coreboot executa a quantidade mínima absoluta de inicialização de hardware, em seguida, passa o controle para o sistema operacional. Como resultado, não existe um código coreboot executando uma vez que o sistema operacional assumiu o controle; em particular, System Management Mode (SMM) não está ativado. Uma característica do coreboot é que a versão x86 é executado em modo 32-bits depois de executar apenas dez instruções (quase todos as outras BIOS x86 executam exclusivamente em modo 16-bits). Isto é semelhante ao moderno firmware UEFI, que é usado em hardware PC mais recente.
Por si só, coreboot não fornece serviços de chamadas da BIOS. O SeaBIOS payload pode ser usado para fornecer chamadas de BIOS, e assim, permitir que coreboot carregue sistemas operacionais que necessitam desses serviços, como o Windows 2000/XP/Vista/7 e BSDs. No entanto, sistemas operacionais mais modernos acessam o hardware de uma outra maneira e usam apenas as chamadas da BIOS durante a inicialização e como um mecanismo de retorno.
Estágios do Coreboot
- Estágio Bootblock: prepara para obter acesso ao Flash e procura o estágio ROM para usar;
- Estágio ROM: memória e início do chipset init (um pouco como PEI em EFI);
- Estágio RAM: enumeração de dispositivos e atribuição de recursos, criação de tabelas ACPI, manipulador SMM (um pouco como o estágio DXE no EFI);
- Payload.
Inicializando DRAM
O hardware mais difícil que o coreboot inicializa é os controladores DRAM e DRAM. Em alguns casos, a documentação técnica sobre este assunto é NDA restrito ou indisponível. Inicialização RAM é particularmente difícil, porque antes da RAM estar inicializada não pode ser usado. Portanto, para inicializar controladores de DRAM e DRAM, o código de inicialização pode ter somente os registros de propósito geral da CPU ou Cache-as-RAM como armazenamento temporário.
O romcc, um compilador C que utiliza registos em vez de RAM, facilita a tarefa. Usando o romcc, é relativamente fácil fazer acessos SMBus às ROMs SPD das DRAM DIMMs, que permite que a RAM seja usada.
Com os processadores x86 mais recentes, o cache do processador pode ser usado como RAM até que a DRAM seja inicializada. O cache do processador também tem de ser inicializado no modo Cache-as-RAM, mas isso requer menos instruções do que inicializar a DRAM. Além disso, a inicialização do modo Cache-as-RAM é específica para arquiteturas de CPU, portanto mais genérica que a inicialização DRAM, que é específica para cada chipset e placa mãe.