Bağdaştırıcı RAM'ini işlem adres alanıyla eşleme

Makale çevirileri Makale çevirileri
Makale numarası: 189327 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Büyük miktarda bağdaştırıcısının bellek eşleştirdiğinizde, aşağıdaki belirtilerden birini alabilirsiniz:
  • <a1>Sistem</a1> NO_MORE_SYSTEM_PTES (PTE) olarak kullanım dışı kalması.
  • Sürekli işlem adres alanı yetersiz.
Bu makalede anlatılmaktadır:
  • neden bu sorunlar oluşur.
  • bunları bir çözüm bulma
  • işlem adres alanına bağdaştırıcısının bellek eşleştirmek için iki yol

Daha fazla bilgi

Sayfa tablosu girdileri (PTE) Giriº

Bir Windows NT sistemde çalışan her işlemde 0xFFFFFFFF kullanımına 0x00000000 kadar 4 GB sanal adres var. Bu, sistemde çalışan tüm işlemler için 0xFFFFFFFF olarak 0x8000000 kadar 2 GB adres üst yaygındır ve çekirdek veya sistem adres alanı olarak bilinir. Alt bölge için 0x7FFFFFFF 0x00000000 arasında kullanıcı adres alanı olarak bilinir.

Işlem açısından, her öğe, sanal adres fiziksel belleğin bayt için kavramsal olarak gösterir. Bu, sanal bellek yöneticisi (VMM) işlemci bellek yöneticisi birimi (MMU çevirmek için karşılık gelen fiziksel bir adrese her sanal adres eşleme) birlikte sorumluluğunu olur. VMM eşleme sabit boyutlu sayfa çerçevelere RAM bölerek gerçekleştirir bu sayfa çerçeveler hakkında bilgi saklamak için sayfa tablo oluşturma ve bunları eşleniyor. Her PTE sayfa çerçeveyi temsil eder ve bir sayfayı bulmak VMM için gereken bilgileri içerir.

Bir 4 KB sayfa boyutu kullanan bir x 86 tabanlı sistemde, en fazla 2 GB adres alanı eşleşmesi için gereken PTE'leri 524,288 (2 GB/4 KB) sayısıdır. Tipik bir sistemde, bu alanı aşağıdaki gibi kullanılır:
  • Maksimum 50.000 PTE'leri (yaklaşık olarak 195 MB adres alanı), genel kullanım için ayrılmıştır.
  • Diğer sistem önbelleği, derin uzay, disk belleği olan havuz, diske alınamayan havuz, kilitlenme bilgi dökümü alanı vb. eşleme kullanılır.
Bu PTE havuzu boyutu, sistemdeki fiziksel bellek miktarına bağlı olarak sistem başlatma sırasında otomatik olarak belirlenir. Bu havuz belleği havuzu ve fiziksel bellek miktarı ile sistemde bulunan da büyür ve disk belleği olmayan havuz arasında doğru kayarken.

Sistem bu PTE'leri çekirdek iş parçacığı yığınları oluşturmak için aygıt sürücülerini (ve kendi DLL dosyaları), g/Ç aktarımları veya Arayanların MmMapIoSpace/MmMapLockedPages/MmGetSystemAddressForMdl/MmAllocateNonCachedMemory ve diğer çeşitli amaçlarla sistem sanal adres alanı eşlemek için kullanır. Bu bir sistem PTE havuzu yoğun olarak kullanılan ve çok parçalanmış duruma kullanabilirsiniz. Toplam adres alanı yine de kalan karşın sürücünüz yeterli bir bitişik sanal adres alanı için sistem PTE havuzu herhangi bir anda, alma olanağınız olabilir bunun anlamı büyük olabilir.

Ayrıca, sürücü sistem PTE havuzu kadar tümüyle kullanıyorsa, sistemin diğer bölümleri, (bazı sürücüler ayıramıyor-sistem bellek MustSucceed parametresi ayarlanmış nedeni), sistem stalls ve outright hata denetimleri oluşturulmamış iş parçacıklarının bile sonuç düşer, gelir.

Bu yalnızca havuzu eşleme kullanırken çok dikkatli olmanız gerekir. Sistem gerçekten gereksinim RAM bağdaştırıcının bölümlerini herhangi bir işlem bağlamı erişimi ve yalnızca gereken tutarı eşleme kullanın. Gerçekten tüm sistem modundan erişim gerekmez, tüm bağdaştırıcı aralığı eşleyin.

ÖNEMLI: doğru bir işlem bağlamında bitirdiğiniz olarak bellek siler. Aksi takdirde, sistem PTElerini dışında çalışır ve onay hata. Toplam sistem bellek - en büyük bir değer kadar (Artırılmış için eşit sayfa sayısı) bir sayı ekleyerek kayıt tabanlı PTE'leri hesaplanan varsayılan sayısını artırabilirsiniz:
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
   \Memory Management\SystemPages
				
, ayrıca şu anda kullanılabilir "boş sistem sayfa tablosu performans izleyicisi'ni kullanarak girdileri" izleyebilirsiniz.

Not: Bağdaştırıcı bellek sayfalar için sayfa değiştirme kullanılır. Boşta kalma veya tamamen dışında takas işlemi olsa da, işlemin adres alanına eşlenen kalırlar.

Aşağıdaki bağdaştırıcısının bellek eşleştirmek için iki yaygın yöntemlerdir. Ilk yöntem, doğrudan işlemin kullanıcı alanı bellek eşleştirir ve işlemin sistem alanını ve isteğe bağlı olarak kullanıcı alanı ikinci yöntem eşler. Bu yöntemlerin her ikisi de, fiziksel belleğin sürekli olmasını gerektirir. PTE sınırlaması nedeniyle, büyük miktarda bellek sistem alan eşleme olmayabilir. Ancak, bunu değil parçalanmış veya kullanılan, kullanıcı alanına eşleştirmek mümkün olabilir.

Bölüm nesne yöntemi

DDK Windows NT 4.0 Bu eşleştirme gerçekleştirme gösteren BELGESINI (MSDN Professional üyeliği kullanılabilir) örnek (MAPMEM) yok. Teknik anahattı aşağıdadır:

  1. Bağdaştırıcısının bellek çevrilmiş fiziksel adresi al (HalTranslateBusAddress).
  2. Fiziksel bellek aygıtı \Device\PhysicalMemory bölümü tanıtıcısını (ZwOpenSection) açın.
  3. Nesne tanıtıcısı (ObReferenceObjectByHandle silinmesini önlemek için) başvuru.
  4. Bellek (ZwMapViewOfSection) eşleştirin.
Yalnızca ZwMapViewOfSection aldığınız bir sanal adres, eşlenen bir işlem bağlamında geçerlidir. Sürücünüzün ertelenmiş yordam çağrısı (DPC) bellekte erişmek veya bir rasgele bir işlem bağlamında çalışır (ISR) hizmeti yordamı durdurmak istiyorsanız, sistem adres alanının (kullanın sonraki yönteme) bellekte eşleme. Daha önce eşlenen (ZwUnMapViewOfSection) aynı bellek işlem bağlamı unmap çıkar.

Not: genel olarak, fiziksel sayfa zaten sahip olmadıkça \Device\PhysicalMemory kullanarak ZwMapViewOfSection kullanmak tehlikeli olabilir. Sahibi, sayfa özniteliklerini değiştirebilirsiniz, çünkü, hemen her zaman nedenler Bellek Bozulması kendi değil, sayfaları eşleyen BIR sürücü sayfaları boşaltın ve diğer değişiklikleri yapın. Sürücüler, sahip oldukları bellek eşleştirme. Ayrıca, kesinlikle bir fiziksel adresle aynı anda iki farklı öznitelik eşlemek için geçersiz (diğer bir deyişle, önbelleğe alınmış karşılık Önbelleklenmemiş karşılık writecombined). Bunu yaparsanız, işlemci TLB Bozulması ve öngörülemeyen sonuçlara neden olur.

WindowsXP üzerinde aynı fiziksel adresini çakışan öznitelikleri bulunabilecektir eşlemek sürücüleri deneyin ZwMapViewOfSection işlevi STATUS_CONFLICTING_ADDRESSES hata verir.

MmMapIoSpace yöntemi

Bu yöntem, bellek, sistem işlem adres alanı ve kullanıcı işlem adres alanı eşleme gösterir.
  1. Çevrilen fiziksel adresi bağdaştırıcısının bellek (HalTranslateBusAddress) alın.
  2. Bellek disk belleği olmayan sistem adres alanına aşağıdaki şekilde eşleştirilir:
          SystemVirtualAddress = MmMapIoSpace(PhysicalAddress, SizeofMemory,
             CacheEnable);
    					
  3. Bir Mdl ayrılamadı:
          Mdl = IoAllocateMdl(SystemVirtualAddress, SizeOfMemory, FALSE, FALSE,
             NULL);
  4. MDL, bellek sayfalarını tanımlamak için yapı:
          MmBuildMdlForNonPagedPool(Mdl);
  5. Bellek, işlem eşleme kullanıcı alanı MmMapLockedPages kullanarak olur. Dönüş değeri, bu işlev Windows NT SP4 öncesi ve SP4 sonrası sürümleri arasında bir tutarsızlık olmadığından bu kod, Windows NT'NIN tüm sürümlerinde uyumlu hale getirmek için aşağıdaki deyimi kullanın:
          UserVirtualAddress = (PVOID)(((ULONG)PAGE_ALIGN(MmMapLockedPages(Mdl,
             Mode))) + MmGetMdlByteOffset(Mdl));
    					
Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
199311BILGI: Gerçek ve sanal adres SP4'te MmMapLockedPages döndürüyor
Avantajı, bu yöntem, herhangi bir işlem bağlamı (DPC ve ISR gibi) kullanılabilen SystemVirtualAddress ve kullanıcı modu, bu bağlamda, eşlenen uygulama tarafından kullanılabilecek bir UserVirtualAddress almak olur.

Sistem adres alanına eşleme, sizin gibi unmap:
MmUnmapIoSpace(SystemVirtualAddress, SizeofMemory);
				
kullanıcı adres alanına eşleme, size gibi yalnızca, bellek eşlemeli bir işlem bağlamında çalışırken unmap:
MmUnmapLockedPages(UserVirtualAddress, Mdl); 

Finally, free the MDL by calling:

IoFreeMdl(Mdl);
				

Referanslar

Daha fazla bilgi için "ınside Windows NT" tarafından ılgaz Custer (Microsoft Press 1993) veya Windows NT 4.0 DDK belgelerine bakın.

Özellikler

Makale numarası: 189327 - Last Review: 7 Mart 2005 Pazartesi - Gözden geçirme: 1.2
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Win32 Device Driver Kit for Windows NT 4.0
Anahtar Kelimeler: 
kbmt kbhowto kbkmode KB189327 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:189327
Kullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com