Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Çekirdek, çekirdek dağıtıcı nesneleri veya yalnızca dağıtıcı nesneleri olarak adlandırılan bir nesne türü kümesi tanımlar. Dağıtıcı nesneleri zamanlayıcı nesnelerini, olay nesnelerini, semafor nesnelerini, mutex nesnelerini ve iş parçacığı nesnelerini içerir.
Sürücüler, IRQL'nin PASSIVE_LEVEL'e eşit olduğu bir durumda, rastgele olmayan bir iş parçacığı bağlamında dağıtıcı nesnelerini eşitleme mekanizması olarak kullanabilir.
Dağıtıcı Nesne Durumları
Çekirdek tanımlı her dağıtıcı nesne türünün Sinyalli veya Sinyalsiz olarak ayarlanmış bir durumu vardır.
Bir veya daha fazla iş parçacığı KeWaitForSingleObject, KeWaitForMutexObject veya KeWaitForMultipleObjects çağrısında bulunursa, bir iş parçacığı grubu işlemlerini eşitleyebilir. Bu işlevler, dağıtıcı nesne göstergelerini giriş olarak kabul eder ve başka bir rutin veya iş parçacığı bir veya daha fazla dağıtıcı nesnesini Signaled durumuna ayarlayana kadar bekler.
Bir iş parçacığı, bir dağıtıcı nesnesini beklemek için KeWaitForSingleObject (veya bir mutex için KeWaitForMutexObject) çağırdığında, dağıtıcı nesnesi Signaled durumuna ayarlanana kadar iş parçacığı bekleme durumuna alınır. Bir iş parçacığı, KeWaitForMultipleObjects çağrısını yaparak, bir grup dağıtıcı nesneden herhangi birinin veya tamamının Sinyalli olarak ayarlanmasını bekleyebilir.
Bir dağıtıcı nesnesi Signaled durumuna ayarlandığında, çekirdek bu nesnenin hazır olmasını bekleyen tüm iş parçacığının durumunu değiştirir. (Eşitleme zamanlayıcıları ve eşitleme olayları bu kuralın özel durumlarıdır; bir eşitleme olayı veya zamanlayıcı işaretlendiğinde, yalnızca bir bekleyen iş parçacığı hazır duruma ayarlanır. Daha fazla bilgi için bkz . Zamanlayıcı Nesneleri, DPC'ler ve Olay Nesneleri.) Hazır durumdaki bir iş parçacığı, geçerli çalışma zamanı iş parçacığı önceliğine ve bu önceliğe sahip herhangi bir iş parçacığı için işlemcilerin geçerli kullanılabilirliğine göre çalışacak şekilde zamanlanır.
Sürücüler Dağıtıcı Nesnelerini Ne Zaman Bekleyebilir?
Genel olarak, sürücüler yalnızca aşağıdaki koşullardan en az biri doğruysa dağıtıcı nesnelerinin ayarlanmasını bekleyebilir:
Sürücü, keyfi olmayan bir iş parçacığı bağlamında çalıştırılıyor.
Yani, bekleme durumuna girecek iş parçacığını tanımlayabilirsiniz. Uygulamada, sabit olmayan bir iş parçacığı bağlamında yürütülen tek sürücü yordamları DriverEntry, AddDevice, Reinitialize ve Unload yordamlarının yanı sıra en üst düzey sürücülerin dağıtım yordamlarıdır. Tüm bu yordamlar doğrudan sistem tarafından çağrılır.
Sürücü tam anlamıyla senkronize bir G/Ç isteği gerçekleştiriyor.
Başka bir ifadeyle, G/Ç isteğini işlerken hiçbir sürücü herhangi bir işlemi kuyruğa almaz ve altındaki sürücü isteği işlemeyi bitirene kadar üzerindeki sürücü işlemi tamamlamaz.
Ayrıca, bir sürücü, IRQL DISPATCH_LEVEL'e eşit veya üzerinde olduğunda yürütülüyorsa, bekleme durumuna giremez.
Bu sınırlamalara bağlı olarak aşağıdaki kuralları kullanmanız gerekir:
Herhangi bir sürücünün DriverEntry, AddDevice, Reinitialize ve Unload yordamları dağıtıcı nesnelerini bekleyebilir.
En üst düzey bir sürücünün dağıtım işlemleri dağıtıcı nesnelerini bekleyebilir.
G/Ç işlemi zaman uyumluysa, örneğin oluşturma, temizleme, kapatma işlemleri, bazı cihaz G/Ç denetimi işlemleri ve bazı PnP ve güç işlemleri gibi, alt düzey sürücülerin dağıtım yordamları, gönderme nesnelerini bekleyebilir.
Alt düzey sürücülerin dağıtım rutinleri, zaman uyumsuz G/Ç işlemlerinin tamamlanması için bir dağıtıcı nesnesini bekleyemez.
IRQL DISPATCH_LEVEL veya üzerinde çalışan bir sürücü rutini, bir dağıtıcı nesnesinin Sinyal Verildi durumuna ayarlanmasını beklememelidir.
Bir sürücü, bir disk belleği cihazına veya bir disk belleği cihazından aktarım işleminin tamamlanması için bir dağıtıcı nesnesinin Sinyalli duruma ayarlanmasını beklememelidir.
Sürücü yönlendirme rutinleri, okuma/yazma isteklerine hizmet verirken genellikle bir dispatcher nesnesinin Sinyal durumuna ayarlanmasını bekleyemez.
Bir cihaz G/Ç denetim isteği için dağıtım yordamı, yalnızca G/Ç denetim kodunun aktarım türü METHOD_BUFFERED olduğunda dağıtıcı nesnesinin Sinyalli durumuna ayarlanmasını bekleyebilir.
SCSI miniport sürücüleri çekirdek dağıtıcısı nesnelerini kullanmamalıdır. SCSI miniport sürücüleri yalnızca SCSI Bağlantı Noktası Sürücüsü Destek Yordamlarını çağırmalıdır.
Her standart sürücü rutin diğerlerinden farklı olarak rastgele bir iş parçacığı bağlamında çalıştırılır: sıraya alınmış bir işlemi işlemek veya bir cihaz kesintisini ele almak üzere sürücü rutini çağrılırken mevcut olan iş parçacığının bağlamında. Ayrıca, çoğu standart sürücü rutinleri, ya DISPATCH_LEVEL'de ya da cihaz sürücüleri için DIRQL'de, yükseltilmiş bir IRQL seviyesinde çalıştırılır.
Gerekirse, bir sürücü, sürücünün diğer rutinlerinin (ISR veya SynchCritSection rutinleri dışında) bir ayırıcı nesneyi Sinyal Durumu'na ayarlayıp Not-Signaled güç durumuna sıfırlamasını bekleyebilen, cihaza özel bir iş parçacığı oluşturabilir.
Genel bir kılavuz olarak, yeni cihaz sürücünüzün G/Ç işlemleri sırasında cihaz durumu değişikliklerini beklerken genellikle 50 mikrosaniyeden uzun süre beklemesi gerektiğini düşünüyorsanız, cihaza özel iş parçacığına sahip bir sürücü uygulamayı göz önünde bulundurun. Cihaz sürücüsü aynı zamanda en üst düzey bir sürücüyse sistem çalışan iş parçacıklarını kullanmayı ve bir veya daha fazla işlem iş parçacığı geri çağırma yordamı uygulamayı göz önünde bulundurun. Bkz PsCreateSystemThread ve Driver-Created İş Parçacığı ile Kilitlenmiş Kuyrukların Yönetimi.