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.
Çerçeve tabanlı bir sürücüdeki kodun neredeyse tamamı olay geri çağırma işlevlerinde bulunur. Çerçeve, bir sürücünün geri çağırma işlevlerinin çoğunu aşağıdaki gibi otomatik olarak eşitler:
Çerçeve her zaman genel cihaz nesnesi, işlevsel cihaz nesnesi (FDO) ve fiziksel cihaz nesnesi (PDO) olay geri çağırma işlevlerini birbiriyle eşitler. Her cihaz için aynı anda yalnızca bir geri çağırma işlevi çağrılabilir. EvtDeviceSurpriseRemoval, EvtDeviceQueryRemove ve EvtDeviceQueryStop özel durumudur. Bu geri çağırma işlevleri Tak Çalıştır (PnP) ve güç yönetimi olaylarını destekler ve IRQL = PASSIVE_LEVEL'de çağrılır.
İsteğe bağlı olarak, çerçeve bir sürücünün G/Ç isteklerini işleyen geri çağırma işlevlerinin yürütülmesini eşitleyebilir, böylece bu geri çağırma işlevleri birer birer çalışır. Çerçeve özellikle istek nesnesinin EvtRequestCancel geri çağırma işleviyle birlikte kuyruk, kesme, ertelenen yordam çağrısı (DPC), zamanlayıcı, iş öğesi ve dosya nesneleri için geri çağırma işlevlerini eşitleyebilir. Çerçeve, bu geri çağırma işlevlerinin çoğunu IRQL = DISPATCH_LEVEL olarak çağırır, ancak kuyruk ve dosya nesnesi geri çağırma işlevlerini IRQL = PASSIVE_LEVEL'de çalışmaya zorlayabilirsiniz. (İş öğesi geri çağırma işlevleri her zaman PASSIVE_LEVEL'de çalışır.)
Çerçeve, bir dizi iç eşitleme kilidi kullanarak bu otomatik eşitlemeyi uygular. Çerçeve, iki veya daha fazla iş parçacığının aynı geri çağırma işlevini aynı anda çağırmasını engeller. Her iş parçacığı, geri çağırma işlevini çağırmadan önce bir eşitleme kilidi elde edene kadar beklemelidir. (İsteğe bağlı olarak, sürücüler gerektiğinde bu eşitleme kilitlerini de alabilir. Daha fazla bilgi için bkz. Çerçeve Kilitlerini Kullanma.)
Sürücünüz nesneye özgü verileri nesne bağlam alanında depolamalıdır. Sürücünüz yalnızca çerçeve tanımlı arabirimler kullanıyorsa, yalnızca nesneye tanıtıcı alan geri çağırma işlevleri bu verilere erişebilir. Çerçeve, sürücünün geri çağırma işlevlerine çağrıları eşitlerse, aynı anda yalnızca bir geri çağırma işlevi çağrılır. Nesnenin bağlam alanına bir kerede yalnızca bir geri çağırma işlevi erişebilir.
Sürücünüz pasif düzeyde kesme işleme uygulamadığı sürece, kesmeleri işleyen ve kesme verilerine erişen kod cihazın IRQL (DIRQL - Kesme Talebi Düzeyi) seviyesinde çalışmalı ve ek senkronizasyon gerektirir. Daha fazla bilgi için bkz. Kesme Kodunun Eşitlenmesi.
Sürücünüz G/Ç isteklerini işleyen geri çağırma işlevlerinin otomatik olarak eşitlenmesini etkinleştirirse, çerçeve bu geri çağırma işlevlerini eşitler ve böylece tek tek çalışır. Aşağıdaki tabloda, çerçevenin senkronize ettiği geri çağırma işlevleri listelenmektedir.
| Nesne türü | Eşitlenmiş Geri Çağırma İşlevleri |
|---|---|
Kuyruk nesnesi |
|
Dosya nesnesi |
|
İstek nesnesi |
İsteğe bağlı olarak, çerçeve bu geri çağırma işlevlerini sürücünüzün cihaz için sağladığı kesme, DPC, iş öğesi ve zamanlayıcı nesnesi geri çağırma işlevleriyle de eşitleyebilir (kesme nesnesinin EvtInterruptIsr geri çağırma işlevi hariç). Bu ek eşitlemeyi etkinleştirmek için, sürücünün bu nesnelerin yapılandırma yapılarının AutomaticSerialization üyesini TRUE olarak ayarlaması gerekir.
Özetle, çerçevenin otomatik eşitleme özelliği aşağıdaki özellikleri sağlar:
Çerçeve her zaman her cihazın PnP ve güç yönetimi geri çağırma fonksiyonlarını senkronize eder.
İsteğe bağlı olarak, çerçeve bir G/Ç kuyruğunun istek işleyicilerini ve birkaç ek geri çağırma işlevini eşitleyebilir (önceki tabloya bakın).
Bir sürücü çerçeveden kesme, DPC, iş öğesi ve zamanlayıcı nesneleri için geri çağırma işlevlerini senkronize etmesini isteyebilir.
Sürücülerin, kesme kodunu ve kesme verilerine erişimi Kesme Kodunu Eşitleme bölümünde açıklanan teknikleri kullanarak eşitlemesi gerekir.
Çerçeve, sürücünün CompletionRoutine geri çağırma işlevi veya G/Ç hedef nesnesinin tanımladığı geri çağırma işlevleri gibi bir sürücünün diğer geri çağırma işlevlerini eşitlemez. Bunun yerine, çerçeve sürücülerin bu geri çağırma işlevlerini eşitlemek için kullanabileceği ek kilitler sağlar.
Eşitleme kapsamı seçme
Çerçevenin bir cihazın tüm G/Ç kuyruklarıyla ilişkili tüm geri çağırma işlevlerini eşitlemesini seçebilirsiniz. Alternatif olarak, framework'ün bir cihazın G/Ç kuyruklarının her biri için geri çağırma işlevlerini ayrı olarak eşitlemesini seçebilirsiniz. Sürücünüzün kullanabileceği eşitleme seçenekleri şunlardır:
Cihaz düzeyinde eşitleme
Çerçeve, cihazın tüm G/Ç kuyrukları için geri çağırma işlevlerini senkronize eder, böylece bunlar teker teker çalışır. Çerçeve, geri çağırma işlevini çağırmadan önce cihazın eşitleme kilidini alarak bu eşitlemeyi sağlar.
Kuyruk düzeyinde eşitleme
Çerçeve, her bir G/Ç kuyruğu için geri çağırma işlevlerini senkronize eder, böylece bunlar sırayla çalıştırılır. Çerçeve, geri çağırma işlevini çağırmadan önce kuyruğun eşitleme kilidini alarak bu eşitlemeyi başarır.
Eşitleme yok
Çerçeve, önceki tablodaki geri çağırma işlevlerinin yürütülmesini eşitlemez ve geri çağırma işlevlerini çağırmadan önce eşitleme kilidi almaz. Eşitleme gerekiyorsa, sürücü bunu sağlamalıdır.
Çerçevenin sürücünüz için cihaz düzeyinde eşitleme, kuyruk düzeyi eşitleme veya eşitleme sağlamamasını isteyip istemediğinizi belirtmek için, sürücü nesneniz, cihaz nesneleriniz veya kuyruk nesneleriniz için bir eşitleme kapsamı belirtin. Nesnenin WDF_OBJECT_ATTRIBUTES yapısının SynchronizationScope üyesi, nesnenin eşitleme kapsamını tanımlar. Sürücünüzün belirtebileceği eşitleme kapsamı değerleri şunlardır:
WdfSynchronizationScopeDevice
Çerçeve, bir cihaz nesnesinin senkronizasyon kilidini alarak eşitlenir.
WdfSynchronizationScopeQueue
Çerçeve, kuyruk nesnesinin senkronizasyon kilidini alarak işlem gerçekleştirir.
WdfSynchronizationScopeNone
Çerçeve senkronize olmaz ve senkronizasyon kilidi almaz.
WdfSynchronizationScopeInheritFromParent
Çerçeve nesnenin SynchronizationScope değerini nesnenin üst nesnesinden alır.
Genel olarak, cihaz düzeyinde eşitleme kullanmaktan kaçının.
Eşitleme kapsamı değerleri hakkında daha fazla bilgi için bkz. WDF_SYNCHRONIZATION_SCOPE.
Sürücü nesneleri için varsayılan eşitleme kapsamı WdfSynchronizationScopeNone'dir. Cihaz ve kuyruk nesneleri için varsayılan eşitleme kapsamı WdfSynchronizationScopeInheritFromParent'tir.
Tüm cihazlar için cihaz düzeyinde eşitleme sağlamak üzere çerçeveyi kullanmak için, sürücünün sürücü nesnesinin WDF_OBJECT_ATTRIBUTES yapısında SynchronizationScope'u WdfSynchronizationScopeDevice olarak ayarlayın. Her cihaz nesnesi için varsayılan WdfSynchronizationScopeInheritFromParent değerini kullanın.
Tek tek cihazlar için cihaz düzeyinde eşitleme sağlamak için, sürücü nesnesi için varsayılan WdfSynchronizationScopeNone değerini kullanın. Tek tek cihaz nesnelerinin WDF_OBJECT_ATTRIBUTES yapısında SynchronizationScope'uWdfSynchronizationScopeDevice olarak ayarlayın.
Çerçevenin bir cihaz için kuyruk düzeyinde eşitleme sağlamasını istiyorsanız aşağıdaki teknikleri kullanabilirsiniz:
Çerçeve sürümleri 1.9 ve üzeri için, kuyruk nesnesinin WDF_OBJECT_ATTRIBUTES yapısında WdfSynchronizationScopeQueue'yi ayarlayarak tek tek kuyruklar için kuyruk düzeyi eşitlemeyi etkinleştirin. Bu teknik tercih edilir.
Alternatif olarak, tüm çerçeve sürümlerinde aşağıdaki adımları kullanabilirsiniz:
- Cihaz nesnesinin WDF_OBJECT_ATTRIBUTES yapısında SynchronizationScope değerini WdfSynchronizationScopeQueue olarak ayarlayın.
- Her cihazın kuyruk nesneleri için varsayılan WdfSynchronizationScopeInheritFromParent değerini kullanın.
Çerçevenin sürücünüzün G/Ç isteklerini işleyen geri çağırma işlevlerini eşitlemesini istemiyorsanız sürücünüzün sürücüsü, cihazı ve kuyruk nesneleri için varsayılan SynchronizationScope değerini kullanın. Bu durumda, çerçeve sürücünün G/Ç isteğiyle ilgili geri çağırma işlevlerini otomatik olarak eşitlemez. Çerçeve, IRQL <= DISPATCH_LEVEL'de geri çağırma işlevlerini çağırabilir.
SynchronizationScope değerinin ayarlanması yalnızca önceki tablonun içerdiği geri çağırma işlevlerini eşitler. Çerçevenin sürücünün kesme, DPC, iş öğesi ve zamanlayıcı nesnesi geri çağırma işlevlerini de eşitlemesini istiyorsanız, bu nesnelerin yapılandırma yapılarının AutomaticSerialization üyesini TRUE olarak ayarlayın.
AutomaticSerialization değerini yalnızca eşitlemek istediğiniz tüm geri çağırma işlevleri aynı IRQL'de çalışıyorsa TRUE olarak ayarlayabilirsiniz. Daha sonra açıklanan bir yürütme düzeyi seçmek, uyumsuz IRQL düzeylerine neden olabilir. Böyle bir durumda, sürücü OtomatikSerialization'ı ayarlamak yerine çerçeve kilitlerini kullanmalıdır. Kesme, DPC, iş öğesi ve zamanlayıcı nesnelerinin yapılandırma yapıları hakkında daha fazla bilgi edinmek ve bu yapılarda Otomatik Seri Duruma Getirme'yi ayarlamaya yönelik kısıtlamalar hakkında daha fazla bilgi için bkz. WDF_INTERRUPT_CONFIG, WDF_DPC_CONFIG, WDF_WORKITEM_CONFIG ve WDF_TIMER_CONFIG.
AutomaticSerialization değerini TRUE olarak ayarlarsanız kuyruk düzeyinde eşitleme'yi seçin.
Yürütme düzeyi seçme
Bir sürücü bazı çerçeve nesnesi türleri oluşturduğunda, nesne için bir yürütme düzeyi belirtebilir. Yürütme düzeyi, çerçevenin bir sürücünün G/Ç isteklerini işleyen nesnenin olay geri çağırma işlevlerini çağırdığı IRQL'i belirtir.
Sürücü bir yürütme düzeyi sağlarsa, sağlanan düzey kuyruk ve dosya nesneleri için geri çağırma işlevlerini etkiler. Normalde, sürücü otomatik eşitleme kullanıyorsa, çerçeve bu geri çağırma işlevlerini IRQL = DISPATCH_LEVEL olarak çağırır. Sürücü bir yürütme düzeyi belirterek çerçeveyi IRQL = PASSIVE_LEVEL'de bu geri çağırma işlevlerini çağırmaya zorlayabilir. Çerçeve, kuyruk ve dosya nesnesi geri çağırma işlevlerini çağırdığı IRQL'i ayarlarken aşağıdaki kuralları kullanır:
Sürücü otomatik eşitleme kullanıyorsa, sürücü çerçeveden IRQL = PASSIVE_LEVEL'de geri çağırma işlevlerini çağırmasını istemediği sürece, çerçeve IRQL = DISPATCH_LEVEL'de kuyruk ve dosya nesnesi geri çağırma işlevlerini çağırır.
Bir sürücü otomatik eşitleme kullanmıyorsa ve bir yürütme düzeyi belirtmiyorsa, çerçeve IRQL <= DISPATCH_LEVEL konumunda sürücünün kuyruğu ve dosya nesnesi geri çağırma işlevlerini çağırabilir.
Sürücünüz dosya nesnesi geri çağırma işlevleri sağlıyorsa, büyük olasılıkla çerçevenin IRQL = PASSIVE_LEVEL bu geri çağırma işlevlerini çağırmasını istersiniz çünkü dosya adı gibi bazı dosya verileri sayfalanabilir.
Yürütme düzeyi sağlamak için sürücünüzün nesnenin WDF_OBJECT_ATTRIBUTES yapısının ExecutionLevel üyesi için bir değer belirtmesi gerekir. Sürücünüzün belirtebileceği yürütme düzeyi değerleri şunlardır:
WdfExecutionLevelPassive
Çerçeve, nesnenin IRQL = PASSIVE_LEVEL'deki geri çağırma işlevlerini çağırır.
WdfExecutionLevelDispatch
Çerçeve, nesnenin IRQL <= DISPATCH_LEVEL geri çağırma işlevlerini çağırabilir. Sürücü otomatik eşitleme kullanıyorsa, çerçeve her zaman IRQL = DISPATCH_LEVEL'de geri çağırma işlevlerini çağırır.
WdfExecutionLevelInheritFromParent
Çerçeve, nesnenin ExecutionLevel değerini nesnenin üst öğesinden alır.
Sürücü nesneleri için varsayılan yürütme düzeyi WdfExecutionLevelDispatch'tır. Diğer tüm nesneler için varsayılan yürütme düzeyi WdfExecutionLevelInheritFromParent'tir.
Yürütme düzeyi değerleri hakkında daha fazla bilgi için bkz. WDF_EXECUTION_LEVEL.
Aşağıdaki tabloda, çerçevenin kuyruk nesneleri ve dosya nesneleri için sürücünün geri çağırma işlevlerini çağırabileceği IRQL düzeyi gösterilmektedir.
| Eşitleme Kapsamı | Yürütme Düzeyi | Kuyruk ve Dosya Geri Çağırma İşlevlerinin IRQL'i |
|---|---|---|
WdfSynchronizationScopeDevice |
WdfExecutionLevelPassive |
PASİF_SEVİYE |
WdfSynchronizationScopeDevice |
WdfExecutionLevelDispatch |
Dağıtım Düzeyi |
WdfSynchronizationScopeQueue |
WdfExecutionLevelPassive |
PASİF_SEVİYE |
WdfSynchronizationScopeQueue |
WdfExecutionLevelDispatch |
Dağıtım Düzeyi |
WdfSynchronizationScopeNone |
WdfExecutionLevelPassive |
PASİF_SEVİYE |
WdfSynchronizationScopeNone |
WdfExecutionLevelDispatch |
<= SEVK_SEVİYESİ |
Sürücü, cihaz, dosya, kuyruk, zamanlayıcı ve genel nesneler için yürütme düzeyini WdfExecutionLevelPassive veya WdfExecutionLevelDispatch olarak ayarlayabilirsiniz. Diğer nesneler için yalnızca WdfExecutionLevelInheritFromParent ayarlayabilirsiniz.
WdfExecutionLevelPassive değerini şu durumda belirtin:
Sürücünüzün geri çağırma işlevleri, yalnızca IRQL = PASSIVE_LEVEL'de çağırabileceğiniz çerçeve yöntemlerini veya Windows Sürücü Modeli (WDM) yordamlarını çağırmalıdır.
Sürücünüzün geri çağırma işlevleri sayfalanabilir koda veya verilere erişmelidir. Örneğin, dosya nesnesi geri çağırma işlevleri genellikle sayfalanabilir verilere erişir.
WdfExecutionLevelPassive ayarı yerine, sürücünüz WdfExecutionLevelDispatch ayarlayabilir ve IRQL = PASSIVE_LEVEL bazı işlemleri işlemesi gerekiyorsa iş öğeleri oluşturan bir geri çağırma işlevi sağlayabilir.
Sürücünüzün bir nesnenin yürütme düzeyini WdfExecutionLevelPassive olarak ayarlayıp ayarlamayeceğine karar vermeden önce sürücünüzün ve sürücü yığınındaki diğer sürücülerin çağrıldığı IRQL'i belirleyin. Aşağıdaki durumları göz önünde bulundurun:
Sürücünüz çekirdek modu sürücü yığınının en üstündeyse, sistem genellikle sürücüyü IRQL = PASSIVE_LEVEL olarak çağırır. Böyle bir sürücünün istemcisi UMDF tabanlı bir sürücü veya kullanıcı modu uygulaması olabilir. WdfExecutionLevelPassive değerinin belirtilmesi sürücünün performansını olumsuz etkilemez çünkü çerçevenin sürücünüzün IRQL = PASSIVE_LEVEL'de çağrılan iş öğelerine yönelik çağrılarını kuyruğa almasına gerek yoktur.
Sürücünüz yığının en üstünde değilse, sistem büyük olasılıkla IRQL = PASSIVE_LEVEL'de sürücünüzü çağırmaz. Bu nedenle, çerçeve sürücünüzün iş öğelerine yönelik çağrılarını kuyruğa almalıdır; bu iş öğeleri daha sonra IRQL = PASSIVE_LEVEL seviyesinde çağrılır. Bu işlem, sürücünüzün geri çağırma işlevlerinin IRQL <= DISPATCH_LEVEL olarak çağrılmasına izin vermekle karşılaştırıldığında düşük sürücü performansına neden olabilir.
DPC nesneleri için ve pasif düzey zamanlayıcıları temsil etmeyen zamanlayıcı nesneleri için, üst cihazın yürütme düzeyini WdfExecutionLevelPassive olarak ayarlarsanız yapılandırma yapısının AutomaticSerializationüyesini TRUE olarak ayarlayamazsınız. Çerçeve, IRQL = PASSIVE_LEVEL'de cihaz nesnesinin geri çağırma eşitleme kilitlerini alır. Bu nedenle, IRQL = DISPATCH_LEVEL'de yürütülmesi gereken DPC veya zamanlayıcı nesnesi geri çağırma işlevlerini eşitlemek için kilitleri kullanamaz. Bu durumda, sürücünüz birbiriyle eşitlenmesi gereken tüm cihazlarda, DPC'de veya zamanlayıcı nesnesi geri çağırma işlevlerinde çerçeve döndürme kilitleri kullanmalıdır.
Ayrıca, pasif düzey zamanlayıcıları temsil eden zamanlayıcı nesneleri için yapılandırma yapısının AutomaticSerialization üyesini TRUE olarak ayarlayabileceğinizi unutmayın, ancak üst cihazın yürütme düzeyi WdfExecutionLevelPassive olarak ayarlanmışsa.