Aracılığıyla paylaş


İleti sinyalli kesmelere giriş

İleti sinyalli kesmeler (MSI), çizgi tabanlı kesmelere alternatif olarak PCI 2.2 belirtiminde kullanıma sunulmuştur. Kesmeleri tetikmek için ayrılmış bir pin kullanmak yerine, MSI kullanan cihazlar belirli bir bellek adresine bir değer yazarak bir kesme tetikler. PCI 3.0, daha fazla programlanabilirlik sağlayan , MSI-X adlı genişletilmiş bir MSI biçimi tanımlar. Tek bir cihaz hem MSI hem de MSI-X'i destekleyebilir. Böyle bir cihaz için işletim sistemi otomatik olarak MSI-X kullanır.

Kesme iletisi, bir cihazın kesmeyi tetikleme amacıyla belirli bir adrese yazdığı belirli bir değerdir. Satır tabanlı kesmelerin aksine, ileti sinyalli kesmeler uç semantiğine sahiptir. Cihaz bir ileti gönderir, ancak kesmenin alındığına dair herhangi bir donanım bildirimi almaz.

PCI 2.2 için bir ileti bir adres ve kısmen opak 16 bit değerden oluşur. Her cihaza tek bir adres atanır. Birden çok ileti göndermek için cihaz, iletileri ayırt etmek için ileti değerinin daha düşük 4 bitini kullanabilir. Bu nedenle, PCI 2.2 için cihazlar en fazla 16 iletiyi destekleyebilir.

PCI 3.0 için ileti bir adres ve opak 32 bit değerden oluşur. Her farklı iletinin kendi benzersiz adresi vardır. PCI 2.2'nin aksine cihaz değeri değiştirmez. PCI 3.0 için bir cihaz en fazla 2.048 farklı iletiyi destekleyebilir. PCI 3.0 MSI-X destekleyen cihazlarda, cihazdaki kesme kaynaklarının her biri için girişleri içeren dinamik olarak programlanabilir bir donanım tablosu bulunur. Bu tablodaki her giriş, bir cihaza ayrılan iletilerden biriyle programlanabilir ve bağımsız olarak maskelenebilir. Sürücüler, kesme iletisinin programlamasını tablo girdisi haline getirebilir ve bir girdinin maskelenip maskelenmediğini kontrol edebilir. Daha fazla bilgi için bkz. MSI-X'i Dinamik Olarak Yapılandırma.

Sürücüler, tüm olası iletileri veya her ileti için tek tek InterruptService yordamlarını işleyen tek bir InterruptMessageService yordamı kaydedebilir.

Sürücüler, bir cihazın gönderdiği MSI'leri aşağıdaki gibi işleyebilir:

  1. Sürücü yüklemesi sırasında kayıt defterinde MSI'leri etkinleştirin. Cihaz için ayrılacak ileti sayısını belirtmek için kayıt defterini de kullanabilirsiniz. Daha fazla bilgi için Kayıt Defterinde Message-Signaled Kesmelerini Etkinleştirme bölümüne bakın.

  2. İsteğe bağlı olarak, kesme iletilerinin sayısını artırın ve bir IRP_MN_FILTER_RESOURCE_REQUIREMENTS isteğine yanıt vererek ileti başına bazı ayarları kaydedin. Daha fazla bilgi için Kesme Kaynağı Tanımlayıcılarını Kullanma bölümüne bakın.

  3. IRP_MN_START_DEVICE için sürücünün dağıtım yordamında IoConnectInterruptEx'i çağırarak cihazın kesmelerine hizmet vermek üzere bir InterruptService veya InterruptMessageService yordamı kaydedin. IoConnectInterruptEx'in CONNECT_FULLY_SPECIFIED sürümünü kullanarak belirli bir iletiye yönelik bir InterruptService yordamını veya tüm iletiler için tek bir InterruptMessageService yordamı kaydetmek üzere IoConnectInterruptEx'in CONNECT_MESSAGE_BASED sürümünü kaydedin. Daha fazla bilgi için, IoConnectInterruptEx'in CONNECT_MESSAGE_BASED Sürümünü Kullanma ve IoConnectInterruptEx'in CONNECT_FULLY_SPECIFIED Sürümünü Kullanma kısmına bakın.

  4. Sürücü artık cihazdan kesmeleri hizmet etmeyi amaçlamadıktan sonra, kayıtlı kesme hizmeti yordamlarını kaldırmak için IoDisconnectInterruptEx'i (cihazın kesmelerini devre dışı bırakdıktan sonra) çağırın.

Çoklu ileti kullanacak şekilde tasarlanmış sürücüler, beklenen sayıda iletinin tahsis edildiğini kontrol etmelidir. Tak çalıştır (PnP) yöneticisi istenen sayıda ileti ayıramıyorsa, bunun yerine cihaza tam olarak bir ileti ayırır. Sürücüler, gerçekte ayrılan iletilerin sayısını aşağıdaki yollardan biriyle denetleyebilir:

  • PnP yöneticisi, ayrılmış iletilerin sayısını ham kaynak tanımlayıcıları listesinde bildirir. Daha fazla bilgi için, Kesme Kaynağı Tanımlayıcılarını Kullanma bölümüne bakın.

  • IoConnectInterruptEx döndüğünde, Parameters->MessageBased.ConnectContext.InterruptMessageTable->MessageCount'i ayrılan ileti sayısına ayarlar.