06 - Detecção e Inicialização de Dispositivos (PCI, USB, SATA)
video: https://youtu.be/... no frontmatter da nota.1. A Topologia de Barramentos e o Ambiente DXE
Após a validação primária do processador (BIST), o treinamento da memória RAM (MRC) e a desativação da técnica Cache-as-RAM, o firmware da placa-mãe (especificamente durante a fase DXE - Driver Execution Environment na arquitetura UEFI) depara-se com um sistema computacional funcional do ponto de vista de processamento, mas completamente isolado do mundo exterior.
Para que o sistema possa interagir com o administrador (via teclado e vídeo) e carregar o sistema operacional (via armazenamento), o firmware precisa descobrir, energizar e mapear topologicamente todos os periféricos de Entrada e Saída (I/O). Diferente dos primórdios da computação, onde os endereços eram fixos em hardware (jumpers), os sistemas modernos utilizam arquiteturas de autodescoberta e autoconfiguração dinâmicas. O firmware atua como o mestre de cerimônias dessa enumeração.
2. A Espinha Dorsal do Sistema: Enumeração PCI Express (PCIe)
O padrão Peripheral Component Interconnect Express (PCIe) não é um barramento compartilhado elétrico tradicional, mas sim uma rede de comutação de pacotes serial ponto-a-ponto (point-to-point topology) interligada por switches lógicos. Contudo, do ponto de vista do software e do firmware, o PCIe mantém compatibilidade reversa com o modelo lógico estruturado do PCI legado.
A Estrutura BDF (Bus, Device, Function)
O firmware localiza dispositivos através de um sistema de coordenadas tridimensional lógico conhecido como BDF:
-
Bus (Barramento): Variando de 0 a 255. O barramento 0 (
Bus 0) é sempre o Root Complex, localizado no interior da própria CPU, onde residem os controladores de memória e os links diretos para a GPU primária e armazenamento NVMe direto. -
Device (Dispositivo): Variando de 0 a 31 por barramento.
-
Function (Função): Variando de 0 a 7 por dispositivo. Permite que um único chip físico opere como múltiplos dispositivos lógicos (ex: uma placa-mãe que possui áudio e rede no mesmo chip multifuncional).
O ECAM (Enhanced Configuration Access Mechanism)
Para interrogar um endereço BDF, o firmware UEFI moderno abandona as antigas e lentas portas de I/O (CF8h e CFCh) e utiliza o ECAM. O ECAM mapeia o espaço de configuração de 4KB de cada função PCIe diretamente em uma vasta janela reservada na memória RAM física (Memory-Mapped I/O).
O algoritmo de varredura (Bus Enumeration) opera da seguinte forma:
-
O firmware lê os primeiros bytes do Espaço de Configuração de um determinado BDF.
-
Se o valor retornado for
0xFFFFpara o Vendor ID (ID do Fabricante), o firmware conclui que o slot lógico está vazio elétricamente e avança. -
Se um valor válido for lido (ex:
0x10ECpara Realtek,0x8086para Intel), um dispositivo físico respondeu. -
O firmware lê o registrador de Class Code e Subclass. É esta assinatura padronizada que diz ao firmware a natureza do hardware recém-descoberto. Por exemplo, um Class Code
01hindica armazenamento em massa.
Uma vez descoberto, o firmware analisa os registradores BAR (Base Address Registers) do dispositivo. O hardware informa ao firmware de quanta janela de memória ele precisa para se comunicar. O firmware então aloca endereços físicos de RAM que não colidam com os pentes de memória DRAM e grava esses endereços de volta nos BARs do dispositivo. O link está estabelecido.
3. Inicialização de Armazenamento: AHCI (SATA) e NVMe
Com a rede PCIe varrida, o firmware possui uma lista de componentes, mas os discos rígidos e SSDs conectados às controladoras ainda estão adormecidos. O firmware precisa carregar seus drivers DXE específicos para falar os protocolos de armazenamento.
Controladoras SATA via AHCI
Quando o firmware detecta um dispositivo PCIe com Class Code 01h e Subclass 06h, ele sabe que encontrou um HBA (Host Bus Adapter) operando no padrão AHCI (Advanced Host Controller Interface), o controlador moderno para discos SATA.
-
O firmware acessa a memória mapeada pelo BAR do AHCI, conhecido como ABAR (AHCI Base Address).
-
Ele emite um sinal elétrico analógico out-of-band chamado COMRESET através das vias de dados PHY do cabo SATA para acordar o disco rígido ou SSD SATA.
-
O disco acorda do modo de economia de energia (spin-up no caso de discos mecânicos) e responde com um sinal de sincronização
COMINIT. -
O firmware interroga os registradores de assinatura na porta do AHCI. O disco retorna a assinatura
0x00000101para unidades ATA (discos convencionais) ou0xEB140101para ATAPI (drives de CD/DVD lógicos).
Armazenamento Direto via NVMe
O protocolo NVMe (Non-Volatile Memory Express) contorna completamente os controladores SATA e o gargalo do protocolo AHCI, anexando os chips de memória NAND quase que diretamente ao barramento PCIe da CPU. Um drive NVMe é detectado como Class Code 01h e Subclass 08h.
Ao contrário do AHCI, o NVMe foi desenhado para paralelismo extremo multithread. O firmware UEFI inicializa o NVMe alocando na memória RAM principal estruturas circulares de comunicação chamadas Admin Submission Queue (ASQ) e Admin Completion Queue (ACQ). O firmware grava os comandos de leitura e identificação de blocos na fila ASQ em RAM, e toca o "sino de hardware" (Doorbell Register) no chip PCIe do NVMe. O controlador do SSD lê a memória da placa-mãe via DMA (Direct Memory Access), processa o comando de boot, e devolve o resultado na ACQ.
4. O Barramento USB e a Controladora xHCI
Para que o administrador possa pressionar F2 ou Del para entrar no Setup, ou dar boot por um pendrive de instalação do Linux, o firmware precisa domar a complexidade do Universal Serial Bus (USB) durante a inicialização.
Em placas-mãe contemporâneas, o padrão de controle universal é o xHCI (eXtensible Host Controller Interface), detectado no barramento PCIe como Class Code 0Ch, Subclass 03h, Prog IF 30h. A controladora xHCI é capaz de rotear nativamente desde dispositivos lentos (USB 1.1) até ultra-rápidos (USB 3.2+).
A rotina de enumeração USB executada pela UEFI segue o protocolo restrito do padrão USB:
-
Energização do Root Hub: A controladora xHCI aplica $+5\text{V}$ (VBUS) nas portas físicas.
-
Detecção Elétrica: O hardware detecta a conexão física de um pendrive ou teclado quando uma diferença de potencial é criada por resistores de pull-up nas linhas de dados
D+ouD-. -
USB Reset e Endereço Zero: O firmware envia um comando de reset na porta. Por padrão da especificação USB, qualquer dispositivo recém-conectado escuta obrigatoriamente no Endereço Padrão
0. -
Endpoint 0 (Control Transfer): O firmware abre comunicação com o Endereço 0 no Endpoint 0 (um canal bidirecional de controle de gerenciamento).
-
Get Descriptor: O firmware solicita o Device Descriptor, o qual informa se o aparelho é um Teclado (Classe HID) ou um Armazenamento em Massa (Classe Mass Storage).
-
Set Address: O firmware designa um endereço de hardware único para o dispositivo (ex: Endereço
1a127), removendo-o do Endereço0para evitar colisões quando o próximo dispositivo USB for inicializado.
5. Abstração e Mapeamento: Os UEFI Device Paths
A finalidade suprema de toda essa complexa sinalização analógica, verificação de BARs PCIe e roteamento xHCI executada pela UEFI não é entregar um sistema completamente otimizado. O firmware inicializa esses dispositivos apenas o suficiente para conseguir interagir e carregar binários na memória. (O kernel Linux re-enumerará o barramento PCIe inteiro e carregará seus próprios módulos nativos do zero posteriormente).
O resultado final e estrutural da enumeração na fase DXE é a tradução da fiação física em strings lógicas formatadas e imutáveis, chamadas UEFI Device Paths.
Toda a cadeia física descoberta converte-se em um endereço algorítmico. Por exemplo, se um bootloader .efi for encontrado em um Pendrive USB conectado na primeira porta de uma placa-mãe, o firmware constrói o seguinte mapeamento lógico na memória NVRAM de runtime:
PciRoot(0x0)/Pci(0x14,0x0)/USB(0x0,0x0)/HD(1,GPT,UUID-AQUI,0x800,0x100000)
Este caminho (Path) diz ao firmware exatamente como o elétron deve viajar:
-
Saia do complexo raiz da CPU (
PciRoot). -
Entre no barramento PCIe na função da controladora USB xHCI (
Pci 14.0). -
Comunique-se com o dispositivo de armazenamento anexado à porta USB primária (
USB). -
Entenda os setores formatados sob uma Tabela de Partição GUID localizando a Partição de Sistema EFI específica (
HD).
Quando a fase de detecção e inicialização (DXE) encerra a criação desses Device Paths, o firmware possui a árvore do mundo físico mapeada. Ele encerra a inicialização do hardware, aciona os drivers de sistema de arquivos (como o FAT32) e transfere o fluxo lógico para o Módulo de Seleção de Boot (BDS), aguardando a entrega definitiva do sistema para o bootloader selecionado.