L'hotplug PCIe funziona davvero in pratica?


20

Ho avuto una discussione nei commenti di /security/109199/is-physical-security-less-important-now-for-securing-a-server?noredirect=1#comment194327_109199

La domanda è semplice Qualcuno ha esperienza di hotplugging con successo di una scheda PCIe? Richiede schede madri e schede speciali o dovrebbe funzionare su tutto l'hardware di consumo?


1
La risposta dovrebbe essere duplice. Sia l'hardware che il software (i suoi driver) dovrebbero supportare l'hot plug.
jippie,

Non so se questo aiuta, ma ho appena rimosso con successo la seconda GPU passata da una macchina kvm windows senza influenzare la prima gpu (lo schermo ha appena sfarfallato per un secondo).
feedc0de

Risposte:


43

Ho usato per progettare hardware PCI-Express che richiedeva il supporto hot plug completo in hardware e software, ed è certamente possibile, ma è abbastanza coinvolto e richiede un ampio supporto software - l'hardware è in realtà abbastanza semplice. Ho dovuto progettare l'hardware, quindi implementare il supporto BIOS (UEFI) e kernel (Linux) per i dispositivi PCIe arbitrari hot plug su fibra e rame.

Dal punto di vista del software, è necessario ricordare che PCIe continua con il modello software PCI, compresi i concetti di bus, dispositivo e indirizzamento delle funzioni. Quando il bus PCI viene elencato, viene eseguito come una prima ricerca: Topologia del bus PCI da tldp.org

L'enumerazione PCIe viene generalmente eseguita due volte. Innanzitutto, il BIOS (UEFI o altro) lo farà, per capire chi è presente e quanta memoria hanno bisogno. Questi dati possono quindi essere passati al sistema operativo host che può prenderli così come sono, ma Linux e Windows spesso eseguono anche la propria procedura di enumerazione. Su Linux, questo viene fatto attraverso il sottosistema PCI principale, che cerca il bus, applica eventuali stranezze in base all'ID del dispositivo, quindi carica un driver con un ID corrispondente nella sua funzione probe. Un dispositivo PCI viene identificato tramite una combinazione dell'ID fornitore (16 bit, ad esempio Intel è 0x8086) e dell'ID dispositivo (un altro 16 bit): la fonte Internet più comune è qui: http://pcidatabase.com / .

La parte del software personalizzata arriva durante questo processo di enumerazione e vale a dire che è necessario riservare in anticipo numeri di bus PCI e segmenti di memoria per potenziali dispositivi futuri - questo a volte viene chiamato " bus padding ". Questo evita la necessità di re-enumerare il bus in futuro, cosa che spesso non può essere eseguita senza interrompere il sistema. Un dispositivo PCI ha BAR ( registri di indirizzi di base)) che richiede all'host quanta e di quale tipo (memoria o spazio I / O) ha bisogno il dispositivo - ecco perché non hai più bisogno di jumper come ISA :) Allo stesso modo, il kernel Linux implementa hot plug PCIe attraverso il pciehp conducente. Windows fa cose diverse in base alla versione: le versioni precedenti (penso XP) ignorano tutto ciò che il BIOS dice e fa il proprio sondaggio. Le versioni più recenti credo siano più rispettose del DSDT ACPI fornito dal firmware host (BIOS / EFI) e includeranno tali informazioni.

Questo può sembrare piuttosto coinvolto ed è così! Ma ricorda che qualsiasi laptop / dispositivo con uno slot ExpressCard (che implementa PCIe in quanto puoi avere ExpressCard solo USB) deve farlo, anche se generalmente il riempimento è piuttosto semplice - solo un bus. Il mio vecchio hardware era uno switch PCIe con altri 8 dispositivi dietro, quindi il riempimento è diventato un po 'più complicato.

Dal punto di vista hardware, è molto più semplice. I pin GND della scheda entrano in contatto per primi, e posizioniamo un IC controller controller hot-swap da LTC o simile sulla scheda per alimentare l'alimentazione una volta stabilita la connessione. A questo punto, l'ASIC o FPGA di bordo inizia la sequenza di accensione e inizia a provare l'addestramento del collegamento PCI Express. Supponendo che l'host supporti hot- plug e PCI Express SLTCAP / SLTCTRLregister (in spec: Registro delle capacità degli slot PCI Express, Registro dei controlli degli slot PCI Express. Esistono anche 1 e 2 - bit sufficienti per suddividere in due registri). poiché quella porta è stata configurata per indicare che la porta è compatibile con hot plug, il software può iniziare a enumerare il nuovo dispositivo. Il registro dello stato degli slot (SLTSTA, PCI Express Slot Status Register) contiene bit che il dispositivo target può impostare indicando guasti di alimentazione, blocco di rilascio meccanico e, naturalmente, rilevamento presenza + presenza modificato.

I suddetti registri si trovano in "Spazio di configurazione PCI (Express)", che è una piccola regione della mappa di memoria (4K per PCIe) allocata a ciascun potenziale bdf (bus: dispositivo: funzione). I registri effettivi generalmente risiedono sul dispositivo periferico.

Sul lato host, possiamo usare PRSNT1 # / PRSNT2 # come semplici segnali DC che alimentano l'abilitazione di un interruttore di accensione IC, o eseguire su GPIO sul chipset / PCH per causare un IRQ e innescare un SW 'hey, qualcosa è stato inserito , vai a cercarlo e configuralo! ' routine.

Queste sono molte informazioni che non rispondono direttamente alla tua domanda (vedi sotto per il breve sommario), ma speriamo che ti dia una migliore conoscenza della procedura. Se hai domande su parti specifiche del processo, fammi sapere in un commento qui o mandami un'e-mail e posso discutere ulteriormente + aggiornare questa risposta con quelle informazioni.

Riassumendo : il dispositivo periferico deve essere stato progettato tenendo presente il supporto hot plug da un POV hardware. Un host / slot progettato correttamente supporta anche hot plug e su una scheda madre di fascia alta mi aspetterei che sia sicuro. Tuttavia, il supporto software per questo è un'altra domanda e sfortunatamente sei legato al BIOS che il tuo OEM ti ha fornito.

In pratica, usi questa tecnologia ogni volta che rimuovi / inserisci una PCIe ExpressCard da un computer. Inoltre, anche i sistemi blade ad alte prestazioni (telecom o altro) utilizzano questa tecnologia regolarmente.

Commento finale: salva il PDF collegato alle specifiche di base, PCI-SIG di solito fa pagare dollari per questo :)


2
E per finire la discussione sulla sicurezza, con un FPGA relativamente economico (come un Cyclone IV GX) che funge da dispositivo PCIe, il tuo computer host è fatto : l'FPGA può eseguire qualsiasi azione DMA che desideri.
Krunal Desai,

Ottima spiegazione Cosa succede quando una scheda PCIe compatibile con Hot Plug viene scambiata? Da un lato, il sistema operativo deve enumerare nuovamente la topologia PCIe, visto che è stato inserito un nuovo dispositivo (non può prevedere la dimensione di BAR / quantità di bus che potrebbero essere richiesti dal dispositivo appena inserito), ma dall'altro - la re-enumerazione del sistema potrebbe non essere possibile senza influire sulle risorse che erano già state assegnate ai dispositivi esistenti nella topologia ...
so.very.tired

2
Sì, diventa complicato. Quindi, usando ExpressCard (EC) come esempio, un modo in cui l'ho fatto è stato quello di 'pad' il numero di bus per supportare l'aggiunta di un dispositivo che potrebbe diramarsi su ancora più dispositivi; la maggior parte dei BIOS con un semplice slot EC lo riempie solo di un numero di bus (abbiamo usato quello slot per espanderci su molti dispositivi PCIe). Allo stesso modo, è possibile "riempire" l'intervallo di memoria possibile per l'assegnazione lì per supportare una varietà di dispositivi con un intervallo di indirizzi contiguo, lo stesso con gli IRQ. Il sistema operativo (con / senza ACPI) può quindi fare ciò che vuole. In realtà è "semplice", ma la complessità degli strati SW in una macchina moderna lo rende più difficile.
Krunal Desai,

L'enumerazione PCIe non è in realtà una ricerca approfondita? I registri di base e limite sono impostati in modo tale che tutti i dispositivi al di sotto di una determinata porta debbano essere enumerati prima di passare alla porta successiva.
alex.forencich,

8

A condizione che le connessioni di monitoraggio dello stato di alimentazione siano state esposte al connettore dall'interruttore a monte e l'unità collegabile abbia esposto questi pin e sia configurata per utilizzarli correttamente e (come osserva Jippie) il software può rilevare l'evento hotplug e rispondere correttamente, il la risposta è si.

In generale, questa funzionalità viene utilizzata principalmente nelle server farm e nei data center per collegare a caldo i dischi PCIe tra le altre cose; Non sono sicuro che le apparecchiature di consumo saranno completamente hotplug (è, a mio avviso, facoltativo nelle specifiche).

Tieni presente che fornire l'hardware necessario per supportare hotplug costa denaro (anche se la maggior parte si trova all'interno dell'endpoint PCIe, deve comunque essere impostato, di solito tramite una eeprom), di solito non verrà offerto in un mercato sensibile ai prezzi.

Si noti che l'aggiornamento dinamico della mappa degli indirizzi PCI aggiunge una notevole complessità al driver PCI (e); se viene inserito un nuovo dispositivo, deve essere mappato su qualsiasi bus su cui vive, con le traduzioni dei nuovi indirizzi associati, ma se un dispositivo viene rimosso e quindi sostituito con qualcosa di diverso , rende piuttosto complessa la traccia degli indirizzi spaziali PCI .

Senza questa complessità, il sottosistema PCI viene scansionato una volta (al ripristino del sistema) e rimane statico; non sono necessari ulteriori sforzi.

Ecco le specifiche di base PCIe v3.0 , pagina 514, sezione 6.7 sul supporto Hot Plug. Un esempio di una scheda PCIe che supporta hot plug può essere visto qui, per gentile concessione di iocrest . Si può vedere chiaramente che viene instradata la traccia del connettore più corta: Scheda controller PCI-e SATA III (6G) a 2 porte, chipset Marvell 88SE9120

Tuttavia su questa carta Axxon , la traccia più breve può essere chiaramente vista indirizzata a quella adiacente. Solo a livello fisico, questa scheda non può supportare hot plug: MAP / 950 1 Scheda I / O per porta seriale RS232 per PCI Express (PCIe)


2

Si suppone che funzioni su tutto l'hardware conforme PCIe, se tutto l'hardware di consumo è veramente conforme è una buona domanda, poiché non sono approfondito nelle specifiche PCIe per conoscere i requisiti di test e anche allora, tutti i rivenditori controllano la validità del reclamo? Penso che quasi nessuno lo faccia.

Proprio come l'intera cosa degli standard di sicurezza. La metà (<-hyperbole?) Delle etichette EE che abbiamo con cui puoi rivendicare la compatibilità, senza dover far testare tutto ciò che fai. Dal momento che le cose hotplug non sono pericolose per la vita, non posso immaginare che le persone siano più rigorose al riguardo.

Io, per esempio, non l'ho mai provato e visto che il mio laptop Clevo ha spinto il desktop completamente fuori da casa mia, non ho intenzione di provarlo, dal momento che il modulo GPU nel mio laptop non ha alcuna capacità di hot plug ed è troppo costoso senza essere Dave Jones e ottenere $$$ per il video di una GPU che esplode.


1

Sì funziona. Sono stato in grado di farlo funzionare per collegare a caldo una scheda del telaio del router (contenente più di 10 dispositivi PCIe). Lo chassis ha 16 schede hot plug. Qualsiasi scheda può essere inserita o disinserita in modo casuale in fase di esecuzione senza influire sulle operazioni di traffico sulle altre schede.

La complessità per farlo funzionare dipende dall'ambiente della CPU. Su una CPU integrata, il lavoro consiste semplicemente nell'impostare la mappa delle risorse statiche e gestire gli eventi di modifica della connessione collegando e scollegando i dispositivi PCI. Su x86, è molto più coinvolto a causa della complessità nella gestione degli errori e delle interazioni BIOS / OS.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.