Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

06 - Detecção e Inicialização de Dispositivos (PCI, USB, SATA)

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione 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:

  1. O firmware lê os primeiros bytes do Espaço de Configuração de um determinado BDF.

  2. Se o valor retornado for 0xFFFF para o Vendor ID (ID do Fabricante), o firmware conclui que o slot lógico está vazio elétricamente e avança.

  3. Se um valor válido for lido (ex: 0x10EC para Realtek, 0x8086 para Intel), um dispositivo físico respondeu.

  4. 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 01h indica 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.

  1. O firmware acessa a memória mapeada pelo BAR do AHCI, conhecido como ABAR (AHCI Base Address).

  2. 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.

  3. 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.

  4. O firmware interroga os registradores de assinatura na porta do AHCI. O disco retorna a assinatura 0x00000101 para unidades ATA (discos convencionais) ou 0xEB140101 para 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:

  1. Energização do Root Hub: A controladora xHCI aplica $+5\text{V}$ (VBUS) nas portas físicas.

  2. 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+ ou D-.

  3. 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.

  4. Endpoint 0 (Control Transfer): O firmware abre comunicação com o Endereço 0 no Endpoint 0 (um canal bidirecional de controle de gerenciamento).

  5. 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).

  6. Set Address: O firmware designa um endereço de hardware único para o dispositivo (ex: Endereço 1 a 127), removendo-o do Endereço 0 para 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:

  1. Saia do complexo raiz da CPU (PciRoot).

  2. Entre no barramento PCIe na função da controladora USB xHCI (Pci 14.0).

  3. Comunique-se com o dispositivo de armazenamento anexado à porta USB primária (USB).

  4. 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.