Jak namapovat paměť RAM adaptéru na adresový prostor procesu (Tento článek může obsahovat odkazy na anglický obsah (dosud nepřeložený).)

Překlady článku Překlady článku
ID článku: 189327 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Při mapování velké množství paměti adaptéru můžete obdržet jednu z následujících příznaků:
  • Nedostupnost systému PTEs (NO_MORE_SYSTEM_PTES)
  • Není dostatek místa adresu souvislé procesu.
Tento článek vysvětluje:
  • Proč dochází k těmto problémům
  • jak je vyřešit
  • dva způsoby mapování paměti adaptéru adresní prostor procesu

Další informace

Úvod položek stránkovací tabulky (PTE)

Každý proces spuštěn v systému Windows NT má 4 GB virtuální adresu rozsahu od 0x00000000 0xFFFFFFFF pro jeho použití. Z tohoto rozsahu od 0x8000000 0xFFFFFFFF horní adresa 2 GB je společné pro všechny procesy spuštěné v systému a nazývá adresního prostoru jádra nebo systému. Dolní oblasti rozsahu od 0x00000000 0x7FFFFFFF nazývá adresní prostor uživatele.

Z hlediska proces každý prvek virtuální adresu koncepčně odkazuje bajt fyzické paměti. Je zodpovědností produktem z virtuální paměť správce (VMM) ve spojení s jednotkou správce paměti procesoru (MMU) přeložit nebo mapovat každou virtuální adresu odpovídající fyzická adresa. Produktem VMM provede mapování vydělením RAM do pevné velikosti stránky rámců vytváření tabulek stránky k ukládání informací o tyto rámce stránky a jejich mapování. Každý PTE představuje rámec stránky a obsahuje informace potřebné pro produktem VMM vyhledejte stránky.

V x 86 systému, který používá velikost 4 KB stránky je maximální počet požadovaných mapovat 2 GB adresního prostoru PTEs 524,288 (2 GB nebo 4 KB). V typické systému toto místo se používá následujícím způsobem:
  • Maximální velikost 50 000 PTEs (přibližně 195 MB adresní prostor) jsou vyhrazeny pro obecné použití.
  • Zbývající používá mapování systémové mezipaměti, hyperprostoru, stránkovaného fondu, nestránkovaného fondu, zhroucení výpisu oblasti a tak dále.
Tuto velikost fondu PTE je automaticky určen při spuštění systému na základě množství fyzické paměti v systému. Tento fond squeezed mezi stránkovaného fondu a nestránkovaného fondu také roste s množstvím fyzické paměti v systému i.

Systém používá tyto PTEs vytvářet jádra podprocesu hromádky, načíst ovladače zařízení (a jejich dll), mapovat virtuální adresový prostor systému pro přenosy I/O nebo volajícím MmMapIoSpace/MmMapLockedPages/MmGetSystemAddressForMdl/MmAllocateNonCachedMemory a pro jiné účely různé. Tento systém fondu PTE můžete stanou extrémně zatížen a intenzivně fragmentován. To znamená, že ovladač nebude pravděpodobně možné získat dostatek spojité virtuální adresový prostor ze systému PTE fondu dané kdykoli přestože celkový adresa stále v něm zbývající místo pravděpodobně dostatečně velký.

Také znamená, že pokud ovladač používá zcela nahoru systému PTE fondu, jiných částí systému bude snížit, dokonce výsledné v podprocesů právě nevytvořili, koutů systému a kontroly přímo chybu (protože některé ovladače volání přidělit systémové paměti s nastaveným parametr MustSucceed).

Musí být velmi opatrní při použití této mapy pouze fondu. Použití části adaptéru RAM skutečně potřebujete systému přístup z libovolného kontextu procesu a mapovat pouze částky, které potřebujete. Rozsah celých adaptér mapovat Pokud skutečně nepotřebujete přístup k vše z režimu systému.

Důležité: unmap paměti ihned po skončení v kontextu procesu vpravo. Systém spustí mimo PTEs a bude bug zaškrtnutí. Můžete zvýšit výchozí počet vypočtena PTEs založený na celkové systémové paměti - až do maximální hodnota přidáním čísla (stejná počet stránek třeba zvýšit) registru na:
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
   \Memory Management\SystemPages
				
byste lze také sledovat aktuálně k dispozici "volné položky stránkovací tabulky systému" pomocí sledování výkonu.

Poznámka: stránek paměti adaptéru nejsou použity pro nahrazení stránky. Zůstanou namapované v procesu adresní prostor i když proces je nečinný nebo zcela Prohozené out.

Jsou následující dvě nejběžnější způsoby mapování paměti adaptéru. První metoda mapuje paměti přímo do uživatelského prostoru v procesu a druhá metoda mapuje do systému prostoru procesu a volitelně do uživatelského prostoru. Obě tyto metody vyžadují fyzické paměti být souvislé. Z důvodu omezení PTE pravděpodobně nebude možné mapovat velké množství paměti v systému místa. Však pravděpodobně možné mapovat uživatele prostor Pokud ji nebude fragmentován nebo použili.

Metoda objektu oddílu

V sadě Windows NT 4.0 DDK (k dispozici prostřednictvím členství MSDN Professional), která ukazuje, jak provést toto mapování je ukázkový (MAPMEM). Zde je osnovy techniku:

  1. Získat přeložený fyzická adresa paměti adaptéru (HalTranslateBusAddress).
  2. Otevřít popisovač oddílu (ZwOpenSection) \Device\PhysicalMemory zařízení fyzické paměti.
  3. Odkaz na popisovač objektu (ObReferenceObjectByHandle) zabránit odstranění.
  4. Mapování paměti (ZwMapViewOfSection)
Virtuální adresu získat od ZwMapViewOfSection platí pouze v kontextu procesu je namapován. Chcete-li přístup k paměti volání váš ovladač odložené procedur (DPC) nebo přerušení služby rutina (ISR), který je spuštěn v kontextu libovolného procesu by měl také mapování paměti v systému adresní prostor (použít další metodu). Unmap kontextu procesu (ZwUnMapViewOfSection) paměti ve stejném mapované před jej ukončí.

Poznámka: V obecně může být nebezpečné ZwMapViewOfSection pomocí \Device\PhysicalMemory, pokud již vlastníte fyzické stránky použít. Ovladač, který mapuje stránek, které nevlastní téměř vždy způsobuje poškození paměti protože vlastník může změnit atributy stránky uvolněte stránky a provést další změny. Jednotky by měl mapovat pouze paměti, které vlastní. Také je výhradně neplatné mapování souběžně s dva různé atributy fyzické adresy (tj v mezipaměti writecombined noncached porovnání proti). Tím způsobuje poškození TLB procesoru a výsledky nepředvídatelné.

Na WindowsXP vrátí funkce ZwMapViewOfSection STATUS_CONFLICTING_ADDRESSES chybu, pokud ovladače zkuste namapovat stejnou fyzickou adresu souběžně s konfliktních atributů.

Metoda MmMapIoSpace

Tato metoda ukazuje, jak namapovat paměť v procesu systémového adresního prostoru a adresový prostor procesu uživatele.
  1. Získat přeložený fyzická adresa paměti adaptéru (HalTranslateBusAddress)
  2. Mapování paměti do systémového nestránkovaného adresního prostoru následovně:
          SystemVirtualAddress = MmMapIoSpace(PhysicalAddress, SizeofMemory,
             CacheEnable);
    					
  3. Přidělit Mdl:
          Mdl = IoAllocateMdl(SystemVirtualAddress, SizeOfMemory, FALSE, FALSE,
             NULL);
  4. Sestavit MDL popisují stránek paměti:
          MmBuildMdlForNonPagedPool(Mdl);
  5. Mapování paměti do procesu uživatel místo uživatele pomocí MmMapLockedPages. Protože vrácená hodnota Tato funkce mezi vydání tohoto systému před aktualizací SP4 a zaúčtovat SP4 nekonzistence, aby tento kód kompatibilní s všechny verzemi tohoto systému použít následující příkaz:
          UserVirtualAddress = (PVOID)(((ULONG)PAGE_ALIGN(MmMapLockedPages(Mdl,
             Mode))) + MmGetMdlByteOffset(Mdl));
    					
Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
199311INFORMACE: MmMapLockedPages vrátí skutečná virtuální adresa v SP4
Výhodou této metody je získat SystemVirtualAddress, které lze použít v libovolném kontextu procesu (například volání DPC a ISR) a UserVirtualAddress, které lze použít aplikace uživatelského režimu, v jehož kontextu je namapován.

Pokud mapovat do systémového adresního prostoru jste měli unmap následovně:
MmUnmapIoSpace(SystemVirtualAddress, SizeofMemory);
				
Pokud mapovat uživatele adresní prostor jste měli unmap způsobem pouze při spuštění v kontextu procesu, ve které mapované paměti:
MmUnmapLockedPages(UserVirtualAddress, Mdl); 

Finally, free the MDL by calling:

IoFreeMdl(Mdl);
				

Odkazy

Další informace naleznete v dokumentaci Windows NT 4.0 DDK nebo "Inside Windows NT" podle jménu Custer (Microsoft Press 1993).

Vlastnosti

ID článku: 189327 - Poslední aktualizace: 7. března 2005 - Revize: 1.2
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Win32 Device Driver Kit for Windows NT 4.0
Klíčová slova: 
kbmt kbhowto kbkmode KB189327 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:189327
Právní omezení pro obsah znalostní báze týkající se produktů, jejichž podpora byla ukončena
Tento článek byl napsán o produktech, pro které společnost Microsoft již neposkytuje nadále podporu. Článek je tedy nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.

Dejte nám zpětnou vazbu

 

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