Meddelande signalerade avbrott
Message Signaled Interrupts ( MSI ) är en alternativ in-band- metod för att signalera ett avbrott , genom att använda speciella in-band-meddelanden för att ersätta traditionella out-of-band hävdande av dedikerade avbrottslinjer. Även om det är mer komplext att implementera i en enhet, har meddelandesignalerade avbrott vissa betydande fördelar jämfört med stiftbaserad utombandsavbrottssignalering.
Meddelandesignalerade avbrott stöds i PCI- bussen sedan dess version 2.2, och i senare tillgängliga PCI Express- bussen. Vissa icke-PCI-arkitekturer använder också meddelandesignalerade avbrott.
Översikt
Traditionellt har en enhet en avbrottslinje (stift) som den hävdar när den vill signalera ett avbrott till värdbearbetningsmiljön. Denna traditionella form av avbrottssignalering är en form av styrsignalering utanför bandet eftersom den använder en dedikerad väg för att skicka sådan styrinformation, separat från huvuddatavägen. MSI ersätter de dedikerade avbrottslinjerna med in-band signalering, genom att utbyta speciella meddelanden som indikerar avbrott genom huvuddatavägen. I synnerhet tillåter MSI enheten att skriva en liten mängd avbrottsbeskrivande data till en speciell minnesmappad I/O- adress, och chipsetet levererar sedan motsvarande avbrott till en processor.
En vanlig missuppfattning med MSI är att den tillåter enheten att skicka data till en processor som en del av avbrottet. Datan som skickas som en del av minnesskrivtransaktionen används av styrkretsen för att bestämma vilket avbrott som ska utlösas på vilken processor; att data inte är tillgänglig för enheten för att kommunicera ytterligare information till avbrottshanteraren.
Som ett exempel har PCI Express inga separata avbrottsstift alls; istället använder den speciella meddelanden inom bandet för att tillåta att pinpåståenden eller deassertion kan emuleras. Vissa icke-PCI-arkitekturer använder också MSI; som ett annat exempel HP GSC -enheter inte avbrottsstift och kan generera avbrott endast genom att skriva direkt till processorns avbrottsregister i minnesutrymmet. [ citat behövs ] HyperTransport - protokollet stöder också MSI.
Fördelar
Även om det är mer komplext att implementera i en enhet, har meddelandesignalerade avbrott vissa betydande fördelar jämfört med stiftbaserad utombandsavbrottssignalering. På den mekaniska sidan ger färre stift en enklare, billigare och mer pålitlig kontakt. Även om detta inte är någon fördel för standard PCI-kontakten, drar PCI Express fördel av dessa besparingar.
MSI ökar antalet möjliga avbrott. Medan konventionell PCI var begränsad till fyra avbrott per kort (och eftersom de delades mellan alla kort, de flesta använder bara ett), tillåter meddelandesignalerade avbrott dussintals avbrott per kort, när det är användbart.
Det finns också en liten prestandafördel. I mjukvara kan ett pin-baserat avbrott rasa med en postad skrivning till minnet. Det vill säga, PCI-enheten skulle skriva data till minnet och sedan skicka ett avbrott för att indikera att DMA- skrivningen var klar. En PCI-brygga eller minneskontroller kan dock buffra skrivningen för att inte störa annan minnesanvändning. Avbrottet kunde komma innan DMA-skrivningen var klar, och processorn kunde läsa inaktuella data från minnet. För att förhindra detta lopp krävdes avbrottshanterare att läsa från enheten för att säkerställa att DMA-skrivningen var klar. Denna läsning hade ett måttligt prestationsstraff. En MSI-skrivning kan inte klara en DMA-skrivning, så racet är eliminerat.
MSI-typer
PCI definierar två valfria tillägg för att stödja Message Signaled Interrupts, MSI och MSI-X. PCI Express definierar sin egen meddelandebaserade mekanism för att emulera äldre PCI-avbrott.
MSI
MSI (definierades först i PCI 2.2) tillåter en enhet att allokera 1, 2, 4, 8, 16 eller 32 avbrott. Enheten är programmerad med en adress att skriva till (vanligtvis ett kontrollregister i en avbrottsstyrenhet ), och ett 16-bitars dataord för att identifiera den. Avbrottsnumret läggs till dataordet för att identifiera avbrottet. Vissa plattformar som Windows använder inte alla 32 avbrott utan använder bara upp till 16 avbrott.
MSI-X
MSI-X (definierades först i PCI 3.0) tillåter en enhet att allokera upp till 2048 avbrott. Den enda adress som användes av original MSI visade sig vara restriktiv för vissa arkitekturer. I synnerhet gjorde det det svårt att rikta individuella avbrott till olika processorer, vilket är användbart i vissa höghastighetsnätverksapplikationer. MSI-X tillåter ett större antal avbrott och ger var och en en separat måladress och dataord. Enheter med MSI-X stöder inte nödvändigtvis 2048-avbrott.
Valfria funktioner i MSI (64-bitars adressering och avbrottsmaskering) är också obligatoriska med MSI-X.
PCI Express äldre avbrottsemulering
PCI Express har inga fysiska avbrottsstift, men emulerar de 4 fysiska avbrottsstiften i PCI via dedikerade PCI Express-meddelanden som Assert_INTA och Deassert_INTC . Eftersom den här mekanismen är meddelandebaserad (på PCI Express-lagret), ger den här mekanismen några, men inte alla, fördelarna med PCI-lagrets MSI-mekanism: de fyra virtuella stiften per enhet delas inte längre på bussen (även om PCI Express-kontroller kan kombinerar fortfarande äldre avbrott internt), och avbrottsändringar lider inte längre i sig av rasförhållandena.
PCI Express tillåter enheter att använda dessa äldre avbrottsmeddelanden och bibehåller mjukvarukompatibilitet med PCI-drivrutiner, men de måste också stödja MSI eller MSI-X i PCI-lagret.
x86-system
På Intel-system måste LAPIC vara aktiverat för att PCI (och PCI Express) MSI/MSI-X ska fungera, även på system med enprocessor (enkärna). I dessa system hanteras MSI:er genom att skriva avbrottsvektorn direkt in i LAPIC för processorn/kärnan som behöver serva avbrottet. Intel LAPIC från 2009 stödde upp till 224 MSI-baserade avbrott. Enligt ett Intel-riktmärke från 2009 med Linux minskade användningen av MSI latensen för avbrott med en faktor på nästan tre jämfört med I/O APIC-leverans.
Stöd för operativsystem
I Microsoft-familjen av operativsystem har Windows Vista och senare versioner stöd för både MSI och MSI-X. Stöd lades till i Longhorns utvecklingscykel runt 2004. MSI stöds inte i tidigare versioner som Windows XP eller Windows Server 2003 .
Solaris Express 6/05 som släpptes 2005 lade till stöd för MSI och MSI-X som en del av deras nya enhetsdrivrutinsgränssnitt (DDI) avbrottsramverk.
FreeBSD 6.3 och 7.0 som släpptes 2008 lade till stöd för MSI och MSI-X.
OpenBSD 5.0 släpptes 2011 lade till stöd för MSI. 6.0 har lagt till stöd för MSI-X.
Linux fick stöd för MSI och MSI-X runt 2003. Linux- kärnversioner före 2.6.20 är kända för att ha allvarliga buggar och begränsningar i sin implementering av MSI/MSI-X.
Haiku fick stöd för MSI runt 2010. MSI-X-stöd lades till senare, 2013.
NetBSD 8.0 som släpptes 2018 lade till stöd för MSI och MSI-X.
VxWorks 7 stöder MSI och MSI-X