Aracılığıyla paylaş


Cihaz Verilerine Erişimi Eşitleme

Genellikle bir sürücünün InterruptService veya InterruptMessageService yordamları (ISR) sürücü verilerine ve donanım kaynaklarına erişimi diğer sürücü yordamlarıyla paylaşmalıdır. ISR'ler yükseltilmiş bir IRQL'de kesme bağlamında yürütüldüğünden ve bir sistemin birden çok işlemcisi olabileceğinden, paylaşılan verilere ve kaynaklara erişimi eşitlemek önemlidir, böylece her yordamın bu paylaşılan bilgilere kesinti olmadan geçici olarak özel erişime sahip olacağı garanti edilebilir.

Sistem, kesme kritik bölümü içinde ISR'yi yürüterek bu eşitlemeyi destekler. Kesmenin atanmış bir döndürme kilidi, kesme döndürme kilidi ve IRQL, kesme eşitleme IRQL'i vardır. Sistem, işlemcinin IRQL'ini kesme eşitleme IRQL'sine yükselterek ve kodu yürütmeden önce kesme döndürme kilidini alarak, bu kodun kritik kesit içerisinde paylaşılan bilgilere münhasır erişimle yürütülmesini garanti eder. Sistem, ISR'sini yürütmeden önce her zaman kesmenin kritik bölümüne girer. Farklı kesmeler, kesme döndürme kilidini ve eşitleme IRQL'ini paylaşarak aynı kritik bölümü paylaşabilir.

Sürücüler, SynchCritSection rutinini sağlayarak kesme işleminin kritik bölümünde çalışan kodu uygulayabilir. Sürücü SynchCritSection yordamını çağırmak için KeSynchronizeExecution kullandığında, sistem Kesme parametresi tarafından belirtilen kesme için kritik bölümü otomatik olarak girer.

İşlemcinin IRQL değerini interrupt'ın eşitleme IRQL'ine yükseltmek, daha yüksek eşitleme IRQL'i olan bir kesme dışında mevcut işlemcinin kesintiye uğramasını önler. Döndürme kilidi almak, diğer işlemcilerin bu döndürme kilidiyle ilişkili kritik bölüm kodlarını yürütmesini önler.

Sistem, sürücü IoConnectInterruptEx çağırdığında kesme için kesme dönüş kilidi ve senkronizasyon IRQL'ini atar. Çoğu durumda, sürücü sistemin her iki değeri de belirlemesine izin verebilir:

  • Sürücü IoConnectInterruptEx'in CONNECT_LINE_BASED sürümünü kullanıyorsa ve null döndürme kilidi belirtiyorsa, sistem kesme çizgisi için bir döndürme kilidi ayırır. Sistem ayrıca eşitleme IRQL değerini de belirler (sürücüler isteğe bağlı olarak daha yüksek bir değer belirtebilir).

  • Sürücü IoConnectInterruptEx'in CONNECT_MESSAGE_BASED sürümünü kullanıyorsa ve null döndürme kilidi belirtiyorsa, sistem her kesme iletisi için bir döndürme kilidi ayırır. Sistem ayrıca her ileti için eşitleme IRQL değerini de belirler (sürücüler isteğe bağlı olarak tüm iletiler için ortak olacak daha yüksek bir değer belirtebilir).

Bir sürücünün kendi spin kilidini yalnızca IoConnectInterruptEx'in CONNECT_FULLY_SPECIFIED sürümünü kullanırken ve aynı kritik bölümü paylaşması gereken birden çok kesme vektörü olduğunda ayırması gerekir. Sürücü, IO_CONNECT_INTERRUPT_PARAMETERSSpinLock ve SynchronizeIrql üyelerini kullanarak kendi spin lock ve eşitleme IRQL'sini belirtebilir. Daha fazla bilgi için bkz. IO_CONNECT_INTERRUPT_PARAMETERS.

Kritik bölümleri yazma ve girme hakkında bilgi için bkz. Kritik Bölümleri Kullanma.