Las interrupciones señalizadas por mensaje ( MSI ) son un método alternativo en banda para señalizar una interrupción , utilizando mensajes especiales en banda para reemplazar la afirmación tradicional fuera de banda de líneas de interrupción dedicadas. Si bien son más complejas de implementar en un dispositivo, las interrupciones señalizadas por mensaje tienen algunas ventajas significativas sobre la señalización de interrupciones fuera de banda basada en pines.
Las interrupciones señalizadas por mensaje se admiten en el bus PCI desde su versión 2.2, y en el bus PCI Express disponible más adelante . Algunas arquitecturas que no son PCI también utilizan interrupciones señalizadas por mensaje.
Descripción general
Tradicionalmente, un dispositivo tiene una línea de interrupción (pin) que afirma cuando quiere señalar una interrupción al entorno de procesamiento del host. Esta forma tradicional de señalización de interrupciones es una forma de señalización de control fuera de banda, ya que utiliza una ruta dedicada para enviar dicha información de control, por separado de la ruta de datos principal. MSI reemplaza esas líneas de interrupción dedicadas con señalización en banda, intercambiando mensajes especiales que indican interrupciones a través de la ruta de datos principal. En particular, MSI permite que el dispositivo escriba una pequeña cantidad de datos que describen interrupciones en una dirección de E / S especial mapeada en memoria , y el chipset envía la interrupción correspondiente a un procesador. [1] [2] [3]
Un error común con MSI es que permite que el dispositivo envíe datos a un procesador como parte de la interrupción. Los datos que se envían como parte de la transacción de escritura en memoria son utilizados por el chipset para determinar qué interrupción disparar en qué procesador; que los datos no están disponibles para que el dispositivo comunique información adicional al manejador de interrupciones. [1] [2] [3]
Por ejemplo, PCI Express no tiene pines de interrupción separados en absoluto; en su lugar, utiliza mensajes especiales en banda para permitir que se emule la aserción o desaserción de pines. Algunas arquitecturas que no son PCI también utilizan MSI; como otro ejemplo, los dispositivos HP GSC no tienen pines de interrupción y pueden generar interrupciones solo escribiendo directamente en el registro de interrupciones del procesador en el espacio de la memoria. [ cita requerida ] El protocolo HyperTransport también es compatible con MSI. [4]
Ventajas
Si bien son más complejas de implementar en un dispositivo, las interrupciones señalizadas por mensaje tienen algunas ventajas significativas sobre la señalización de interrupciones fuera de banda basada en pines. En el lado mecánico, menos pines hacen que el conector sea más simple, económico y confiable. Si bien esto no es una ventaja para el conector PCI estándar, PCI Express aprovecha estos ahorros.
MSI aumenta el número de interrupciones posibles. Si bien el PCI convencional se limitó a cuatro interrupciones por tarjeta (y, debido a que se compartieron entre todas las tarjetas, la mayoría usa solo una), las interrupciones señalizadas por mensaje permiten docenas de interrupciones por tarjeta, cuando es útil. [1]
También hay una ligera ventaja de rendimiento. En el software, una interrupción basada en pines podría competir con una escritura publicada en la memoria. Es decir, el dispositivo PCI escribiría datos en la memoria y luego enviaría una interrupción para indicar que la escritura DMA se completó. Sin embargo, un puente PCI o un controlador de memoria pueden almacenar en búfer la escritura para no interferir con otros usos de la memoria. La interrupción podría llegar antes de que se completara la escritura DMA y el procesador podría leer datos obsoletos de la memoria. [5] Para evitar esta carrera, los controladores de interrupciones debían leer desde el dispositivo para asegurarse de que la escritura DMA había terminado. Esta lectura tuvo una penalización de rendimiento moderada. Una escritura MSI no puede pasar una escritura DMA, por lo que se elimina la carrera. [6]
Tipos de MSI
PCI define dos extensiones opcionales para admitir interrupciones señalizadas por mensaje, MSI y MSI-X. PCI Express define su propio mecanismo basado en mensajes para emular las interrupciones PCI heredadas.
MSI
MSI (definido por primera vez en PCI 2.2) permite que un dispositivo asigne 1, 2, 4, 8, 16 o 32 interrupciones. El dispositivo está programado con una dirección para escribir (generalmente un registro de control en un controlador de interrupciones ) y una palabra de datos de 16 bits para identificarlo. El número de interrupción se agrega a la palabra de datos para identificar la interrupción. [1] Algunas plataformas como Windows no usan las 32 interrupciones, solo usan hasta 16 interrupciones. [7]
MSI-X
MSI-X (definido por primera vez en PCI 3.0) permite que un dispositivo asigne hasta 2048 interrupciones. Se encontró que la dirección única utilizada por MSI original era restrictiva para algunas arquitecturas. En particular, dificultaba la orientación de las interrupciones individuales a diferentes procesadores, lo que es útil en algunas aplicaciones de redes de alta velocidad. MSI-X permite un mayor número de interrupciones y le da a cada una una dirección de destino y una palabra de datos independientes. Los dispositivos con MSI-X no admiten necesariamente interrupciones 2048. [3] [8] [9] [10]
Las características opcionales en MSI (direccionamiento de 64 bits y enmascaramiento de interrupciones) también son obligatorias con MSI-X.
Emulación de interrupción heredada PCI Express
PCI Express no tiene líneas de interrupción físicas, pero emula las 4 líneas físicas de PCI a través de mensajes PCI Express dedicados como Assert_INTA y Deassert_INTC . Al estar basado en mensajes (en la capa PCI Express), este mecanismo proporciona algunas, pero no todas, las ventajas del mecanismo MSI de la capa PCI: las 4 líneas virtuales por dispositivo ya no se comparten en el bus (aunque los controladores PCI Express pueden aún combinan las interrupciones heredadas internamente), y los cambios de interrupción ya no sufren inherentemente las condiciones de carrera.
PCI Express permite que los dispositivos utilicen estos mensajes de interrupción heredados, conservando la compatibilidad del software con los controladores PCI, pero también deben admitir MSI o MSI-X en la capa PCI.
sistemas x86
En los sistemas Intel, el LAPIC debe estar habilitado para que funcione PCI (y PCI Express) MSI / MSI-X, incluso en sistemas monoprocesador (de un solo núcleo). [11] [12] En estos sistemas, los MSI se manejan escribiendo el vector de interrupción directamente en el LAPIC del procesador / núcleo que necesita dar servicio a la interrupción. Los Intel LAPIC de 2009 admitieron hasta 224 interrupciones basadas en MSI. [12] Según una evaluación comparativa de Intel de 2009 con Linux , el uso de MSI redujo la latencia de las interrupciones en un factor de casi tres en comparación con la entrega de I / O APIC. [13]
Soporte del sistema operativo
En la familia de sistemas operativos de Microsoft, Windows Vista y las versiones posteriores son compatibles con MSI y MSI-X. El soporte se agregó en el ciclo de desarrollo de Longhorn alrededor de 2004. [14] MSI no es compatible con versiones anteriores como Windows XP o Windows Server 2003 . [15]
La versión 6/05 de Solaris Express agregó soporte para MSI y MSI-X como parte de su nuevo marco de interrupción de interfaz de controlador de dispositivo (DDI). [dieciséis]
FreeBSD 6.3 y 7.0 agregaron soporte para MSI y MSI-X. [17]
OpenBSD 5.0 agregó soporte para MSI. [18] 6.0 soporte agregado para MSI-X. [19]
Linux ganó soporte para MSI y MSI-X alrededor de 2003. [20] Se sabe que las versiones del kernel de Linux anteriores a la 2.6.20 tienen serios errores y limitaciones en su implementación de MSI / MSI-X. [21]
Haiku obtuvo soporte para MSI alrededor de 2010. [22] El soporte MSI-X se agregó más tarde, en 2013. [23]
NetBSD 8.0 agregó soporte para MSI y MSI-X.
VxWorks 7 es compatible con MSI y MSI-X
Referencias
- ^ a b c d Revisión 2.2 de la especificación de bus local PCI . Sección 6.8 (MSI) . PCI-SIG. Diciembre de 1998.
- ^ a b Revisión de la especificación de bus local PCI 2.3 . Sección 6.8 (MSI) . PCI-SIG. 2002.
- ^ a b c Revisión de la especificación de bus local PCI 3.0 . Sección 6.8 (MSI y MSI-X) . PCI-SIG. Agosto de 2002.
- ^ Don Anderson; Jay Trodden (2003). Arquitectura del sistema HyperTransport . Addison-Wesley Professional. pag. 200. ISBN 978-0-321-16845-0.
- ^ Coleman, James (2009). "Descripción general de los métodos de entrega de interrupciones, interrupciones de XT-PIC heredadas, limitaciones de XT-PIC". Reducción de la latencia de interrupciones mediante el uso de interrupciones señalizadas por mensaje (PDF) . Corporación Intel. pag. 10.
- ^ Corbet, Jonathan; Rubini, Alessandro; Kroah-Hartman, Greg (2009). "Capítulo 15: Mapeo de memoria y DMA". Controladores de dispositivos Linux (3.a ed.). O'Reilly Media . Consultado el 20 de abril de 2019 .
- ^ Microsoft. "Habilitación de interrupciones señalizadas por mensaje en el registro" . Microsoft Corporation . Consultado el 12 de abril de 2013 .
- ^ "Sección 6.1: MSI y MSI-X". Revisión de la especificación base PCI Express 1.0a . PCI-SIG . Abril de 2003.
- ^ "Sección 6.1: MSI y MSI-X". Revisión de la especificación base de PCI Express 1.1 . PCI-SIG . Marzo de 2005.
- ^ "Aviso de cambio de ingeniería de MSI-X". Revisión de la especificación de bus local PCI 2.3 (PDF) . PCI-SIG .
- ^ Subsistemas de interrupción basados en APIC en PC monoprocesador
- ^ a b Coleman, James (2009). Reducción de la latencia de interrupciones mediante el uso de interrupciones señalizadas por mensaje (PDF) . Corporación Intel. págs. 10, 11.
- ^ Coleman, James (2009). "Resultados, plataforma de clase de estación de trabajo". Reducción de la latencia de interrupciones mediante el uso de interrupciones señalizadas por mensaje (PDF) . Corporación Intel. pag. 19.
- ^ Mejoras de la arquitectura de interrupción en Microsoft Windows Vista , 11 de agosto de 2004
- ^ PCI, PCI-X y PCI Express: Preguntas frecuentes , 18 de noviembre de 2005, página 4
- ^ John Stearns, Govinda Tatti, Edward Gillett y Anish Gupta, (27 de marzo de 2006) Cambios realizados para admitir MSI en Solaris Express Advanced Interrupt Handlers en el sistema operativo Solaris Express 6/05
- ^ John H. Baldwin, "Interrupciones PCI para máquinas x86 en FreeBSD", sección "disponibilidad"
- ^ Mark Kettenis, (mayo de 2011) MSI interrumpe para muchos dispositivos, en aquellas arquitecturas que pueden admitirlos (amd64, i386, sparc64 solo hasta ahora)
- ^ Mark Kettenis, (mayo de 2016) Se ha agregado soporte inicial para MSI-X
- ^ Primera versión de MSI-HOWTO.txt
- ^ Con Myri10GE, ¿puedo usar interrupciones MSI-X en Linux 2.6.18 y versiones anteriores?
- ^ [1] Haiku se compromete a agregar compatibilidad con MSI
- ^ [2] Haiku se compromete a agregar compatibilidad con MSI-X
enlaces externos
- Introducción a las interrupciones señalizadas por mensaje - MSDN
- CÓMO MSI de Linux