O hotplug do PCIe realmente funciona na prática?


20

Entrei em uma discussão nos comentários de /security/109199/is-physical-security-less-important-now-for-securing-a-server?noredirect=1#comment194327_109199

A questão é simples. Alguém já experimentou conectar com êxito uma placa PCIe? Requer placas-mãe e placas especiais ou deve funcionar com todo o hardware do consumidor?


1
A resposta deve ser dupla. Tanto o hardware quanto o software (seus drivers) devem suportar hot plug.
jippie

Não sei se isso ajuda, mas acabei de remover com êxito o segundo GPU de passagem de uma máquina kvm windows sem afetar o primeiro gpu (a tela piscou por um segundo).
feedc0de

Respostas:


43

Eu costumava projetar hardware PCI-Express que exigia suporte total a hot-plug em hardware e software, e certamente é possível, mas é bastante envolvido e requer amplo suporte de software - o hardware é realmente bastante simples. Eu tive que projetar o hardware e, em seguida, implementar o suporte a BIOS (UEFI) e kernel (Linux) para conectar dispositivos PCIe arbitrários com conexão a quente sobre fibra e cobre.

Do ponto de vista do software, é preciso lembrar que o PCIe continua com o modelo de software PCI, incluindo os conceitos de endereçamento de barramento, dispositivo e função. Quando o barramento PCI é enumerado, é feito como uma pesquisa abrangente: Topologia de barramento PCI do tldp.org

A enumeração PCIe geralmente é feita duas vezes. Primeiro, sua BIOS (UEFI ou não) fará isso para descobrir quem está presente e quanta memória eles precisam. Esses dados podem ser repassados ​​ao sistema operacional host, que pode ser usado como está, mas o Linux e o Windows também executam seu próprio procedimento de enumeração. No Linux, isso é feito através do subsistema principal do PCI, que pesquisa o barramento, aplica quaisquer peculiaridades, se necessário, com base no ID do dispositivo e, em seguida, carrega um driver que possui um ID correspondente na função de análise. Um dispositivo PCI é identificado através de uma combinação de seu ID de fornecedor (16 bits, por exemplo, Intel é 0x8086) e ID de dispositivo (outros 16 bits) - a fonte mais comum da Internet é aqui: http://pcidatabase.com / .

A parte do software personalizado é fornecida durante esse processo de enumeração e é necessário reservar com antecedência números de barramento PCI e segmentos de memória para dispositivos futuros em potencial - isso às vezes é chamado de ' preenchimento de barramento '. Isso evita a necessidade de re-enumerar o barramento no futuro, o que geralmente não pode ser feito sem interrupções no sistema. Um dispositivo PCI possui BARs ( registradores de endereço base) que solicita ao host quanto e que tipo (memória ou espaço de E / S) o dispositivo precisa - é por isso que você não precisa mais de jumpers como o ISA :) Da mesma forma, o kernel Linux implementa o hotplug PCIe por meio do pciehp motorista. O Windows faz coisas diferentes com base na versão - versões mais antigas (acho que XP) ignoram tudo o que o BIOS diz e faz sua própria investigação. Acredito que as versões mais recentes respeitem o ACPI DSDT fornecido pelo firmware do host (BIOS / EFI) e incorporarão essas informações.

Isso pode parecer bastante envolvido e é! Mas lembre-se de que qualquer laptop / dispositivo com um slot ExpressCard (que implementa PCIe, como você pode ter ExpressCards somente USB) deve fazer isso, embora geralmente o preenchimento seja bastante simples - apenas um barramento. Meu hardware antigo costumava ser um switch PCIe que tinha outros 8 dispositivos por trás, então o preenchimento ficou um pouco mais complicado.

Do ponto de vista do hardware, é muito mais fácil. Os pinos GND do cartão entram em contato primeiro e colocamos um IC do controlador hot-swap do LTC ou similar no cartão para sequenciar a energia assim que a conexão é feita. Nesse momento, o ASIC ou FPGA integrado inicia sua sequência de inicialização e começa a tentar treinar o link PCI Express. Supondo que o host suporte hot-plugging e o PCI Express SLTCAP / SLTCTRLregister (em especificação: Registro de capacidade de slot PCI Express, Registro de controle de slot PCI Express. Há 1 e 2 para isso também - bits suficientes para serem divididos em dois registros). se essa porta foi configurada para indicar que a porta é compatível com hot plug, o software pode começar a enumerar o novo dispositivo. O registro de status do slot (SLTSTA, registro de status do slot PCI Express) contém bits que o dispositivo de destino pode definir, indicando falhas de energia, trava de liberação mecânica e, é claro, detecção de presença + presença alterada.

Os registros mencionados acima estão localizados no 'Espaço de configuração PCI (Express)', que é uma pequena região do mapa de memória (4K para PCIe) alocada para cada potencial bdf (barramento: dispositivo: função). Os registros reais geralmente residem no dispositivo periférico.

No lado do host, podemos usar o PRSNT1 # / PRSNT2 # como sinais CC simples que alimentam a habilitação de um interruptor de alimentação IC ou rodar para GPIO no chipset / PCH para causar um IRQ e acionar um SW 'ei, algo foi inserido , encontre-o e configure-o! ' rotina.

Essas são muitas informações que não respondem diretamente à sua pergunta (veja o resumo rápido abaixo), mas esperamos que isso lhe dê uma melhor experiência na compreensão do processo. Se você tiver alguma dúvida sobre partes específicas do processo, informe-me em um comentário aqui ou envie-me um e-mail para que eu possa discutir mais + atualizar esta resposta com essas informações.

Para resumir - o dispositivo periférico deve ter sido projetado com suporte a hot plug em mente a partir de um POV de hardware. Um host / slot projetado adequadamente também é compatível com hot plug, e em uma placa-mãe de alto desempenho, eu esperaria que fosse seguro. No entanto, o suporte de software para isso é outra questão inteiramente e, infelizmente, você está dependente do BIOS que seu OEM lhe forneceu.

Na prática, você usa essa tecnologia sempre que remover / inserir um PCIe ExpressCard de um computador. Além disso, os sistemas blade de alto desempenho (telecomunicações ou outros) também utilizam essa tecnologia regularmente.

Comentário final - salve o PDF que estava vinculado à Base Spec, o PCI-SIG geralmente cobra muito dinheiro por isso :)


2
E para encerrar a discussão sobre segurança, com um FPGA relativamente barato (como um Cyclone IV GX) agindo como um dispositivo PCIe, sua máquina host está pronta - o FPGA pode executar as ações de DMA que desejar.
Krunal Desai

Ótima explicação. O que acontece quando uma placa PCIe compatível com Hot-Plug é trocada? Por um lado, o SO deve enumerar a topologia PCIe novamente, visto que um novo dispositivo foi inserido (não pode prever o tamanho de BARs / quantidade de Barramentos que podem ser solicitados pelo dispositivo recém-inserido), mas por outro lado - re-enumerando o sistema pode não ser possível sem afetar os recursos que já foram atribuídos a dispositivos existentes na topologia ...
so.very.tired

2
Sim, fica complicado. Então, usando o ExpressCard (EC) como exemplo, uma maneira de fazê-lo foi 'aumentar' o número de barramentos para suportar a adição de um dispositivo que pode ramificar para ainda mais dispositivos; a maioria dos BIOSs com um slot CE simples apenas preenche um número de barramento (usamos esse slot para expandir para muitos dispositivos PCIe). Da mesma forma, você pode 'preencher' o intervalo de memória possível para atribuição lá para suportar uma variedade de dispositivos com um intervalo de endereços contíguo, o mesmo com IRQs. O SO (com / sem ACPI) pode fazer o que quiser. Na verdade, é "simples", mas as complexidades das camadas SW em uma máquina moderna tornam mais difícil.
precisa

A enumeração PCIe não é realmente uma pesquisa profunda? Os registros base e limite são configurados de modo que todos os dispositivos abaixo de uma determinada porta sejam enumerados antes de passar para a próxima porta.
alex.forencich 19/01

8

Desde que as conexões de monitoramento do estado de energia tenham sido expostas ao conector pelo switch upstream, e a unidade conectável tenha exposto esses pinos e esteja configurada para usá-los adequadamente e (como observa Jippie), o software pode detectar o evento do hotplug e responder adequadamente, o resposta é sim.

Geralmente, esse recurso é usado principalmente em farms de servidores e data centers para hotplugging de discos PCIe, entre outras coisas; Não tenho certeza de que o equipamento do consumidor seja totalmente compatível com hotplug (é, pelo que entendi, opcional na especificação).

Lembre-se de que o fornecimento do hardware necessário para oferecer suporte ao hotplug custa dinheiro (embora a maioria esteja dentro do ponto de extremidade do PCIe, ele ainda precisa ser configurado, geralmente por meio de um eeprom), normalmente não será oferecido em um mercado sensível a preços.

Observe que a atualização dinâmica do mapa de endereços PCI adiciona complexidade significativa ao driver PCI (e); se um novo dispositivo for inserido, ele deverá ser mapeado para qualquer barramento em que ele esteja, com as novas conversões de endereços associadas, mas se um dispositivo for removido e depois substituído por algo diferente , torna bastante complexo o rastreamento dos endereços de espaço PCI .

Sem essa complexidade, o subsistema PCI é verificado uma vez (na redefinição do sistema) e permanece estático; nenhum esforço adicional é necessário.

Aqui está a especificação básica do PCIe v3.0 , página 514, seção 6.7 no suporte a Hot Plug. Um exemplo de placa PCIe que suporta hot plug pode ser visto aqui, cortesia da iocrest . Pode-se ver claramente que o rastreamento mais curto do conector é roteado: Placa controladora PCI-e SATA III (6G) de 2 portas, chipset Marvell 88SE9120

No entanto, nesta placa Axxon , o traço mais curto pode ser visto claramente roteado para o adjacente. Somente no nível físico, esta placa não pode suportar hot plug: Placa de E / S de porta serial MAP / 950 1 RS232 para PCI Express (PCIe)


2

Supõe-se que ele funcione em todo o hardware compatível com PCIe, se todo o hardware do consumidor é realmente compatível é uma boa pergunta, já que eu não estou aprofundado nas especificações do PCIe para saber sobre os requisitos de teste e, mesmo assim, todos os varejistas verificam a validade da reivindicação? Eu acho que quase nenhum.

Muito parecido com a coisa toda sobre padrões de segurança. Metade (<hipérbole?) Dos rótulos EE com os quais você pode reivindicar compatibilidade, sem ter que testar tudo o que faz. Como o material hotplug não ameaça a vida, não consigo imaginar pessoas sendo mais rigorosas.

Eu, por exemplo, nunca tentei e, visto que meu laptop Clevo expulsou completamente o desktop da minha casa, não vou tentar, pois o módulo GPU do meu laptop não possui capacidade de hotplug e é muito caro sem ser necessário. Dave Jones e recebendo $$$ pelo vídeo de uma GPU explosiva.


1

Sim, funciona. Consegui fazê-lo funcionar para conectar uma placa de linha de chassi de roteador (contendo mais de 10 dispositivos PCIe). O chassi possui 16 placas compatíveis com hotplug. Qualquer um dos cartões pode ser conectado ou retirado aleatoriamente em tempo de execução, sem afetar as operações de tráfego nos outros cartões.

A complexidade para fazê-lo funcionar depende do ambiente da CPU. Em uma CPU incorporada, o trabalho é simplesmente configurar o mapa de recursos estáticos e manipular os eventos de alteração de conexão conectando e desconectando dispositivos PCI. No x86, ele é muito mais envolvido devido à complexidade no tratamento de erros e nas interações do BIOS / OS.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.