05 - CMOS e NVRAM (Configurações Armazenadas)
video: https://youtu.be/... no frontmatter da nota.1. A Necessidade Arquitetural da Persistência de Estado
Embora o código binário do firmware (BIOS ou UEFI) seja gravado em um chip de memória de leitura (Flash ROM), ele não é um sistema rígido e imutável. Para que uma placa-mãe possa operar de forma flexível em diferentes cenários, o firmware exige a capacidade de armazenar e recuperar o estado da configuração entre os ciclos de energia mecânica (estado ACPI G3).
Essa persistência de dados é o que permite ao hardware lembrar a sequência exata de discos para o boot, os parâmetros de tensão e latência aplicados à memória RAM (perfis XMP/EXPO), as chaves criptográficas de segurança e a data e hora do relógio do sistema. A evolução desta camada de armazenamento reflete diretamente a transição das limitações do BIOS legado para a complexidade orientada a objetos da UEFI.
2. A Era Legada: CMOS e SRAM Suportada por Bateria
Em sistemas baseados em BIOS tradicional, o armazenamento de configurações era indissociável do componente de Relógio de Tempo Real (RTC - Real Time Clock). Historicamente derivado do chip Motorola MC146818 no IBM PC original, este circuito possuía um minúsculo banco de memória estática (SRAM) integrado, variando de meros 64 bytes a 256 bytes físicos.
Esta arquitetura introduziu o termo CMOS (Complementary Metal-Oxide-Semiconductor), que tecnicamente descreve o processo de fabricação dos transistores do chip, mas tornou-se o jargão do mercado para se referir ao armazenamento de configurações do BIOS em si.
A SRAM tem uma característica elétrica fundamental: ela é volátil e exige tensão elétrica contínua para manter o estado binário de suas portas lógicas. Para garantir que as configurações do BIOS sobrevivessem ao desligamento da fonte de alimentação principal, a placa-mãe dependia inteiramente de uma bateria de célula tipo moeda (quase invariavelmente uma bateria de Lítio de 3 Volts, modelo CR2032).
-
Limitações: O tamanho restrito obrigava o BIOS a armazenar configurações como bitfields ou variáveis indexadas de 1 byte. Não havia espaço para strings de texto ou caminhos de arquivos.
-
Vulnerabilidade Física: Se a bateria CR2032 descarregasse ou fosse fisicamente removida, o banco de capacitores do circuito RTC esvaziava-se. A SRAM perdia imediatamente sua carga elétrica e, consequentemente, todos os dados de configuração armazenados. Ao reiniciar, o BIOS detectava o checksum de memória inválido e entrava no modo Failsafe/Default, forçando o usuário a reconfigurar relógio e ordem de boot.
-
O Jumper "Clear CMOS": Fabricantes incluíam um jumper físico (uma ponte de curto-circuito) na placa-mãe. Ao conectar os pinos, o circuito aterrava a linha de energia da SRAM, destruindo intencionalmente os dados instantaneamente para recuperar placas-mãe travadas por overclock mal-sucedido.
3. A Modernização: NVRAM e Memória Flash SPI
Com a ascensão da UEFI, o espaço ínfimo de 256 bytes do CMOS legado tornou-se matematicamente incapaz de abrigar a estrutura complexa de dados exigida. A indústria abandonou o uso de memória SRAM dependente de bateria para salvar configurações de firmware.
Em placas-mãe modernas, as configurações são armazenadas na NVRAM (Non-Volatile Random-Access Memory). Fisicamente, a NVRAM não é um chip separado, mas sim uma partição dedicada dentro do mesmo chip de memória SPI Flash ROM de alta densidade (16MB a 64MB) que hospeda o código binário principal da UEFI.
-
Persistência Genuína: Como é baseada em tecnologia de portões flutuantes (EEPROM/Flash), a NVRAM retém os dados indefinidamente, mesmo na ausência absoluta de energia elétrica.
-
A Falácia da Bateria Moderna: É um erro conceitual comum acreditar que remover a bateria CR2032 de uma placa-mãe UEFI moderna apagará as configurações de boot. A bateria atual serve exclusivamente para alimentar o oscilador de cristal do Relógio de Tempo Real (RTC). Variáveis UEFI, ordem de boot e chaves Secure Boot permanecem intactas na NVRAM Flash, independentemente do status da bateria. Para limpar a NVRAM quando o sistema não dá boot (o equivalente moderno ao Clear CMOS), o jumper da placa-mãe agora aciona um pino de hardware do chipset (PCH) que instrui o firmware a reescrever o bloco Flash com os padrões de fábrica no próximo POST.
4. O Paradigma Orientado a Objetos: Variáveis UEFI
A UEFI organiza a NVRAM utilizando um sistema de arquivos chave-valor estruturado. Diferente dos bytes crus do CMOS, os dados na NVRAM são chamados de Variáveis UEFI e possuem um cabeçalho descritivo complexo composto por três elementos cruciais:
-
Vendor GUID (Globally Unique Identifier): Um identificador de 128 bits que categoriza a quem pertence a variável (ex: Variáveis Globais de Boot, Variáveis exclusivas da Microsoft, Variáveis proprietárias da Dell/Lenovo).
-
Variable Name (Nome da Variável): Uma string legível, como
Boot0000,BootOrder,SecureBootouSetup. -
Data (Carga Útil): O valor armazenado (pode ser uma matriz de caminhos de dispositivos EFI, chaves criptográficas em formato X.509 ou booleanos simples).
Além disso, cada variável é salva com uma máscara de bits de atributos (Attributes), que determina o seu escopo de acesso:
-
NV(Non-Volatile): A variável deve ser gravada na Flash física e sobreviver ao reboot. -
BS(BootServiceAccess): A variável está visível apenas durante o POST e a execução do bootloader. -
RT(RuntimeAccess): A variável continua visível e acessível para leitura/escrita mesmo após o kernel Linux assumir o controle total do hardware.
5. A Interface com o Kernel Linux: O Subsistema efivarfs
Uma das capacidades mais formidáveis da arquitetura Linux em ecossistemas UEFI é sua comunicação direta com a NVRAM física sem a necessidade de reiniciar o sistema ou entrar em telas gráficas de setup.
Quando o kernel Linux inicializa via EFI, ele lê a tabela de serviços de runtime fornecida pelo firmware. Utilizando esses serviços, o kernel monta um sistema de arquivos virtual (VFS) no espaço do usuário, tradicionalmente localizado em /sys/firmware/efi/efivars.
Neste diretório, cada arquivo que você visualiza é uma representação em tempo real de uma variável hospedada nos transistores físicos da placa-mãe.
-
Leitura e Manipulação: Ferramentas utilitárias clássicas, como o
efibootmgr, não modificam partições de disco. Elas interagem diretamente com o/sys/firmware/efi/efivarspara criar, deletar ou reordenar as variáveis de boot (ex: alterando a variávelBootOrder). -
Proteção contra Bricking (Imutabilidade): Histórica e tristemente, se uma aplicação de usuário gravasse lixo na NVRAM ou a enchesse até o limite físico de capacidade (alguns chips suportam apenas 64KB de espaço reservado para variáveis), o firmware não conseguiria alocar espaço para o próximo POST, travando a placa-mãe de forma irreparável em nível elétrico (um cenário catastrófico conhecido como brick). Para mitigar isso, os mantenedores do kernel Linux modificaram o módulo
efivarfspara aplicar atributos de imutabilidade estrita do VFS (o equivalente a rodarchattr +i). O Linux recusa-se sumariamente a apagar a maior parte do conteúdo da NVRAM via comandos tradicionais (comorm -rf /), protegendo a sanidade do hardware.
6. O Pstore (Persistent Storage) e o Registro Post-Mortem
O Linux aproveita o fato de a NVRAM ser uma memória persistente à prova de desligamentos para implementar um de seus recursos de diagnóstico mais agressivos: o pstore (Persistent Storage).
Quando o subsistema do kernel sofre um colapso catastrófico incontornável — o temido Kernel Panic ou Oops —, os buffers de log em memória RAM (que continham as mensagens de erro críticas do dmesg) estão fadados a desaparecer no milissegundo em que a máquina reiniciar.
Se a máquina for uma servidora remota sem console visual (KVM) anexado, a causa do travamento seria um mistério total. Através do pstore (normalmente montado em /sys/fs/pstore), o kernel intercepta a exceção final de morte no processador. Antes de enviar o sinal de reinicialização de hardware elétrica, o kernel compacta rapidamente os últimos bytes cruciais do buffer de log de erros e utiliza os serviços de runtime da UEFI para forçar uma gravação síncrona desses bytes em uma área predefinida da NVRAM da placa-mãe.
Ao realizar o próximo ciclo de boot com sucesso, o novo kernel detecta que existe um log residual gravado na placa-mãe, extrai os dados para o espaço do usuário, registra o motivo exato da falha do boot anterior nos logs do systemd-journald e apaga a variável da NVRAM para liberar o espaço, demonstrando a perfeita simbiose entre as decisões de hardware e o rastreamento de software de baixo nível.