35 votos

¿Funciona realmente el hotplug PCIe en la práctica?

Me he metido en una discusión en los comentarios de https://security.stackexchange.com/questions/109199/is-physical-security-less-important-now-for-securing-a-server?noredirect=1#comment194327_109199

La cuestión es sencilla. ¿Alguien tiene experiencia en la conexión en caliente de una tarjeta PCIe? ¿Requiere placas base y tarjetas especiales, o se supone que funciona en todo el hardware de consumo?

64voto

Krunal Desai Puntos 593

Solía diseñar hardware PCI-Express que requería un soporte completo de conexión en caliente en hardware y software, y ciertamente es posible, pero es bastante complicado y requiere un amplio soporte de software - el hardware es en realidad bastante simple. Tuve que diseñar el hardware y, a continuación, implementar el soporte de la BIOS (UEFI) y el kernel (Linux) para la conexión en caliente de dispositivos PCIe arbitrarios a través de fibra y cobre.

Desde el punto de vista del software, hay que recordar que PCIe continúa con el modelo de software PCI, incluyendo los conceptos de bus, dispositivo y direccionamiento de funciones. Cuando se enumera el bus PCI, se hace como una búsqueda de amplitud: PCI Bus topology from tldp.org

La enumeración de PCIe se hace generalmente dos veces. En primer lugar, tu BIOS (UEFI o de otro tipo) lo hará, para averiguar quién está presente y cuánta memoria necesita. Estos datos pueden ser transmitidos al sistema operativo anfitrión, que puede tomarlos tal cual, pero Linux y Windows suelen realizar también su propio procedimiento de enumeración. En Linux, esto se hace a través del subsistema PCI central, que busca en el bus, aplica cualquier peculiaridad si es necesario basándose en el ID del dispositivo, y luego carga un controlador que tenga un ID que coincida en su función de sondeo. Un dispositivo PCI se identifica a través de una combinación de su Vendor ID (16-bits, por ejemplo, Intel es 0x8086) y Device ID (otros 16-bits) -- la fuente de Internet más común es el Repositorio de ID PCI .

La parte del software personalizado entra en este proceso de enumeración y es que debes reservar con antelación Números de bus PCI y segmentos de memoria para posibles dispositivos futuros, lo que a veces se denomina ' acolchado del autobús '. Esto evita la necesidad de volver a enumerar el bus en el futuro, lo que a menudo no puede hacerse sin interrumpir el sistema. Un dispositivo PCI tiene BARs ( registros de dirección base ) que solicitan al host cuánta y qué tipo (memoria o espacio de E/S) de memoria necesita el dispositivo -- esta es la razón por la que ya no se necesitan puentes como ISA :) Igualmente, el kernel de Linux implementa la conexión en caliente de PCIe a través del controlador pciehp. Windows hace cosas diferentes según la versión -- las versiones más antiguas (creo que XP) ignoran cualquier cosa que diga la BIOS y hace su propio sondeo. Las versiones más nuevas creo que son más respetuosas con el ACPI DSDT proporcionado por el firmware del host (BIOS/EFI) e incorporan esa información.

Esto puede parecer bastante complicado, y lo es. Pero recuerde que cualquier portátil / dispositivo con una ranura ExpressCard (que implementa PCIe ya que puede tener ExpressCards sólo USB) debe hacer esto, aunque generalmente el relleno es bastante simple - sólo un bus. Mi antiguo hardware solía ser un conmutador PCIe que tenía otros 8 dispositivos detrás, por lo que el relleno se hizo algo más complicado.

Desde el punto de vista del hardware, es mucho más fácil. Los pines GND de la tarjeta hacen contacto primero, y colocamos un controlador IC de LTC o similar en la tarjeta para secuenciar la energía una vez que se hace la conexión. En este punto, el ASIC o FPGA de la tarjeta comienza su secuencia de encendido, y empieza a intentar entrenar su enlace PCI Express. Asumiendo que el host soporta la conexión en caliente y el PCI Express SLTCAP / SLTCTRL registro (en spec: Registro de capacidad de ranura PCI Express, Registro de control de ranura PCI Express. Hay un 1 y un 2 para esto también - suficientes bits para dividir en dos registros). para ese puerto fue configurado para indicar que el puerto es capaz de conexión en caliente, el software puede comenzar a enumerar el nuevo dispositivo. El registro de estado de la ranura (SLTSTA, PCI Express Slot Status Register) contiene bits que el dispositivo de destino puede establecer indicando fallos de alimentación, bloqueo de liberación mecánica y, por supuesto, detección de presencia + presencia cambiada.

Los registros mencionados se encuentran en el "espacio de configuración PCI (Express)", que es una pequeña región del mapa de memoria (4K para PCIe) asignada a cada posible bdf (bus:dispositivo:función). Los registros reales generalmente residen en el dispositivo periférico.

En el lado del host, podemos utilizar PRSNT1#/PRSNT2# como simples señales de CC que alimentan la habilitación de un interruptor de potencia IC, o ejecutar a GPIO en el chipset / PCH para causar una IRQ y desencadenar una rutina de SW 'hey, algo se insertó, ¡ve a buscarlo y configurarlo!

Se trata de una gran cantidad de información que no responde directamente a su pregunta (véase más abajo el resumen rápido), pero espero que le permita comprender mejor el proceso. Si tiene alguna pregunta sobre partes específicas del proceso, hágamelo saber en un comentario aquí o envíeme un correo electrónico y puedo discutir más y actualizar esta respuesta con esa información.

En resumen -- el dispositivo periférico debe haber sido diseñado teniendo en cuenta la compatibilidad con la conexión en caliente desde el punto de vista del hardware. Un host/ranura correctamente diseñado es capaz de conectarse en caliente también, y en una placa base de gama alta yo esperaría que fuera seguro. Sin embargo, el soporte de software para esto es una cuestión totalmente diferente y, por desgracia, estás en deuda con la BIOS que te ha suministrado tu OEM.

En la práctica, se utiliza esta tecnología cada vez que se retira/inserta una tarjeta PCIe ExpressCard de un ordenador. Además, los sistemas blade de alto rendimiento (de telecomunicaciones o de otro tipo) también utilizan esta tecnología con regularidad.

Último comentario: guarde el PDF de la especificación básica que se ha enlazado, el PCI-SIG suele cobrar un dineral por ello :)

14voto

Peter Smith Puntos 2292

Siempre que las conexiones de monitorización del estado de la energía hayan sido expuestas al conector por el conmutador ascendente, y la unidad enchufable ha expuesto estos pines y está configurada para utilizarlos correctamente y (como señala Jippie) el software puede detectar el evento de conexión en caliente y responder correctamente, la respuesta es sí.

Por lo general, esta capacidad se utiliza principalmente en granjas de servidores y centros de datos para conectar en caliente los discos PCIe, entre otras cosas; no estoy seguro de que los equipos de consumo sean totalmente capaces de conectar en caliente (tengo entendido que es opcional en la especificación).

Hay que tener en cuenta que proporcionar el hardware necesario para soportar la conexión en caliente cuesta dinero (aunque la mayor parte está dentro del punto final PCIe, todavía tiene que ser configurado, normalmente a través de una eeprom), no se suele ofrecer en un mercado sensible al precio.

Tenga en cuenta que la actualización dinámica del mapa de direcciones PCI añade significativo complejidad para el controlador PCI(e); si se inserta un nuevo dispositivo, entonces tiene que ser mapeado en cualquier bus en el que se encuentre, con las nuevas traducciones de direcciones asociadas, pero si se elimina un dispositivo y se vuelve a colocar con algo diferente Ello hace que el seguimiento de las direcciones del espacio PCI sea bastante complejo.

Sin esta complejidad, el subsistema PCI se escanea una vez (al reiniciar el sistema) y permanece estático; no se requiere ningún otro esfuerzo.

Aquí está el Especificaciones básicas de PCIe v3.0 ; véase la sección 6.7 (página 514) sobre el soporte de Hot Plug. Un ejemplo de una tarjeta PCIe que sí soporta la conexión en caliente puede verse aquí, por cortesía de iocrest . Se puede ver claramente que el trazado del conector más corto está enrutado: 2-port SATA III (6G) PCI-e Controller Card, Marvell 88SE9120 Chipset

Sin embargo, en este Axxón tarjeta, se puede ver claramente la traza más corta enrutada a la adyacente. Sólo a nivel físico, esta tarjeta no admite la conexión en caliente: MAP/950 1 RS232 Serial Port I/O Card for PCI Express (PCIe)

3voto

Asmyldof Puntos 9125

Se supone que funciona en todo el hardware compatible con PCIe, si todo el hardware de consumo es realmente compatible es una buena pregunta, ya que no soy profundo en la especificación PCIe para conocer los requisitos de las pruebas e incluso entonces, ¿comprueban todos los minoristas la validez de la afirmación? Creo que casi ninguno lo hace.

Como todo el tema de las normas de seguridad. La mitad (¿hipérbole?) de las etiquetas de EE que tenemos pueden reclamar la compatibilidad con ellas, sin tener que hacer que todo lo que se haga sea probado. Dado que las cosas de hotplug no son una amenaza para la vida, no puedo imaginar que la gente sea más estricta al respecto.

Yo, por mi parte, no lo he probado nunca y viendo que mi portátil Clevo echó al ordenador de sobremesa por completo de mi casa, no voy a probarlo, ya que el módulo de la GPU de mi portátil dice no tener capacidad de conexión en caliente y es demasiado caro sin ser Dave Jones y ponerse $$$ para el vídeo de una GPU que explota.

1voto

Bunts Puntos 11

Sí, funciona. Pude hacer que funcionara para conectar en caliente una tarjeta de línea de un chasis de router (que contiene más de 10 dispositivos PCIe). El chasis tiene 16 tarjetas que se pueden conectar en caliente. Cualquiera de las tarjetas puede ser conectada o desconectada aleatoriamente en tiempo de ejecución sin afectar las operaciones de tráfico en las otras tarjetas.

La complejidad para hacerlo funcionar depende del entorno de la CPU. En una CPU embebida, el trabajo es simplemente configurar el mapa de recursos estáticos y manejar los eventos de cambio de conexión al conectar y desconectar dispositivos PCI. En x86, es mucho más complicado debido a la complejidad en el manejo de errores y las interacciones BIOS/OS.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X