Giriş/Çıkış Yığını Konumları

G/Ç yöneticisi, katmanlı sürücüler zincirindeki her sürücüye, ayarlandığı her IRP için bir G/Ç yığını konumu verir. Her G/Ç yığını konumu bir IO_STACK_LOCATION yapısından oluşur.

G/Ç yöneticisi, katmanlı sürücüler zincirindeki her sürücüye karşılık gelen bir dizi öğesiyle her IRP için bir G/Ç yığın konumları dizisi oluşturur. Her sürücü paketteki yığın konumlarından birine sahip olur ve G/Ç işlemi hakkında sürücüye özgü bilgileri almak için IoGetCurrentIrpStackLocation çağrısında bulunur.

Böyle bir zincirdeki her sürücü IoGetNextIrpStackLocation çağrısından ve ardından sonraki alt sürücünün G/Ç yığını konumunu ayarlamaktan sorumludur. Herhangi bir üst düzey sürücünün G/Ç yığını konumu, sürücünün IoCompletion yordamının temizleme işlemlerini gerçekleştirebilmesi için bir işlemle ilgili bağlamı depolamak için de kullanılabilir.

Katmanlı Sürücülerdeki IRP'leri İşleme şekli, özgün IRP'de iki G/Ç yığını konumu gösterir çünkü iki sürücü, bir dosya sistemi sürücüsü ve bir yığın depolama cihazı sürücüsü gösterir. Katmanlı Sürücülerdeki IRP'leri İşleme şeklinde gösterilen, sürücü tarafından ayrılan IRP'ler, onları oluşturan FSD (Dosya Sistemi Sürücüsü) için bir yığın konumuna sahip değildir. Üst düzey bir sürücü, alt düzey sürücüler için IRP'leri ayırdığında, sonraki alt sürücünün cihaz nesnesinin StackSize değerine göre yeni IRP'lerin kaç G/Ç yığın konumuna sahip olacağını belirlemekle birlikte, kaç yığın konumuna sahip olması gerektiğini de belirler.

Aşağıdaki şekilde IRP'nin içeriği daha ayrıntılı olarak gösterilmiştir.

bir irp'de g/ç yığını konumunun içeriğini gösteren diyagram.

Şekilde gösterildiği gibi, bir IRP'deki sürücüye özgü her G/Ç yığını konumu aşağıdaki genel bilgileri içerir:

  • Sürücünün gerçekleştirmesi gereken temel işlemi gösteren ana işlev kodu (IRP_MJ_XXX)

  • FSD'ler, üst düzey SCSI sürücüleri ve tüm PnP sürücüleri tarafından işlenen bazı önemli işlev kodları için, sürücünün temel işlemin hangi alt bölümünü gerçekleştirmesi gerektiğini gösteren bir ikincil işlev kodu (IRP_MN_XXX)

  • Sürücünün verileri aktardığı veya aktardığı arabelleğin uzunluğu ve başlangıç konumu gibi işleme özgü bağımsız değişkenler kümesi

  • İstenen işlem için hedef (fiziksel, mantıksal veya sanal) cihazı temsil eden, sürücü tarafından oluşturulan cihaz nesnesine yönelik bir işaretçi

  • Açık bir dosyayı, cihazı, dizini veya birimi temsil eden dosya nesnesi işaretçisi

    Dosya sistemi sürücüsü, IRP'lerdeki G/Ç yığını konumu aracılığıyla dosya nesnesine erişir. Diğer sürücüler genellikle dosya nesnesini yoksayar.

Belirli bir sürücünün işlediği IRP ana ve ikincil işlev kodları kümesi cihaza özgü olabilir. Ancak, en düşük düzey sürücüler ve ara sürücüler (PnP işlevi ve filtre sürücüleri dahil) genellikle aşağıdaki temel istek kümesini işler:

  • IRP_MJ_CREATE — Hedef cihaz nesnesini açın ve G/Ç işlemleri için mevcut ve kullanılabilir olduğunu gösterir

  • IRP_MJ_READ — cihazdan veri aktarma

  • IRP_MJ_WRITE — cihaza veri aktarma

  • IRP_MJ_DEVICE_CONTROL — sistem tanımlı, cihaza özgü G/Ç denetim koduna (IOCTL) göre cihazı ayarlama (veya sıfırlama)

  • IRP_MJ_CLOSE — hedef cihaz nesnesini kapatın

  • IRP_MJ_PNP — Cihazda tak çalıştır işlemi gerçekleştirin. PnP yöneticisi tarafından G/Ç yöneticisi aracılığıyla bir IRP_MJ_PNP isteği gönderilir.

  • IRP_MJ_POWER — cihazda bir güç işlemi gerçekleştirin. Güç yöneticisi tarafından G/Ç yöneticisi aracılığıyla IRP_MJ_POWER isteği gönderilir.

Sürücülerin işlemesi gereken ana IRP işlev kodları hakkında daha fazla bilgi için bkz. IRP Ana İşlev Kodları.

Genel olarak G/Ç yöneticisi, en az iki G/Ç yığını konumuna sahip IRP'leri yığın depolama cihazı sürücülerine gönderir çünkü bir dosya sistemi yığın depolama cihazları için diğer sürücülerin üzerine katmanlanır. G/Ç yöneticisi, üzerinde başka bir sürücü katman haline getirilmemiş herhangi bir sürücüye tekil yığın konumuna sahip IRP'ler gönderir.

Ancak G/Ç yöneticisi, sistemdeki mevcut sürücüler zincirine yeni bir sürücü ekleme desteği sağlar. Örneğin, belirli bir disk bölümündeki verileri yedekleyen bir ara katman yansıtma sürücüsü, Katmanlı Sürücülerde IRP'leri İşleme başlıklı şekilde gösterilen dosya sistemi sürücüsü ve en düşük düzey sürücü gibi bir çift sürücü arasına eklenebilir. Bu yeni sürücü kendisini aygıt yığınına bağladığında, G/Ç yöneticisi dosya sistemine, yansıtmaya ve en alt seviye sürücülere gönderdiği tüm G/Ç istek paketlerindeki (IRP) G/Ç yığını konumlarının sayılarını ayarlar. Katmanlı Sürücülerde IRP'leri İşleme şeklindeki şekilde yer alan dosya sistemi tarafından tahsis edilen her bir IRP, böyle yeni bir yansıtma sürücüsü için de ek bir G/Ç yığını konumu içerebilir.

Mevcut bir zincire yeni sürücüler eklemeye yönelik bu desteğin, belirli bir sürücünün IRP'lerdeki G/Ç yığını konumlarına erişiminde belirli kısıtlamalar anlamına geldiğini unutmayın:

  • Katmanlı sürücüler zincirindeki üst düzey bir sürücü, herhangi bir IRP'de yalnızca kendi ve sonraki alt düzey sürücünün G/Ç yığını konumlarına güvenli bir şekilde erişebilir. Böyle bir sürücü, IRP'lerde sonraki alt düzey sürücü için G/Ç yığını konumunu ayarlamalıdır. Ancak, bu kadar üst düzey bir sürücü tasarlarken, sürücünüzün hemen altındaki mevcut zincire ne zaman yeni bir sürücü ekleneceğini (veya eklenip eklenmeyeceğini) tahmin edemezsiniz.

    Bu nedenle, daha sonra eklenen herhangi bir sürücünün, yerinden edilmiş sonraki alt düzey sürücüyle aynı IRP ana işlev kodlarını (IRP_MJ_XXX) işleyeceğini varsaymalısınız.

  • Katmanlı sürücüler zincirindeki en düşük düzey sürücü, herhangi bir IRP'de yalnızca kendi G/Ç yığını konumuna güvenle erişebilir. Böyle bir sürücü tasarlarken, cihaz sürücünüzün üzerindeki mevcut zincire ne zaman yeni bir sürücü ekleneceğini (veya eklenip eklenmeyeceğini) tahmin edemezsiniz.

    En düşük düzeyli bir sürücü tasarlarken, belirli bir IRP'nin kaynağı ne olursa olsun ve üzerinde kaç sürücü katmanlanmış olursa olsun, sürücünün kendi G/Ç yığını konumunda geçirilen bilgileri kullanarak IRP'leri işlemeye devam edebileceğini varsayalım.