Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Som beskrivs i Använda Bus-Master DMA använder vissa drivrutiner för bussmaster-DMA-enheter endast common-buffer DMA, medan andra använder common-buffer DMA i kombination med paketbaserad DMA.
Använd standardbuffert-DMA ekonomiskt. Om du konfigurerar en gemensam buffert kan vissa (eller alla, beroende på storleken på den begärda bufferten) kopplas till de kartregister som är associerade med adapterobjektet som representerar bus-master-adaptern.
Om du konfigurerar gemensamma buffertområden ekonomiskt, till exempel genom att använda PAGE_SIZE segment eller en enda allokering, blir fler kartregister tillgängliga för paketbaserade DMA-åtgärder. Det lämnar också mer ledigt systemminne för andra ändamål, vilket ger bättre övergripande drivrutin och systemprestanda.
För att konfigurera en gemensam buffert för busmaster-DMA måste en busmaster-DMA-enhetsdrivrutin anropa AllocateCommonBuffer med adapterobjektpekaren som returneras av IoGetDmaAdapter. Vanligtvis gör en drivrutin det här anropet från sin DispatchPnP-rutin för IRP_MN_START_DEVICE begäranden. En drivrutin bör endast allokera en gemensam buffert om den kommer att använda bufferten upprepade gånger för sina DMA-åtgärder medan drivrutinen är aktiv. Följande diagram illustrerar ett sådant anrop till AllokeraCommonBuffer.
Den begärda storleken för bufferten, som visas i föregående diagram som LengthForBuffer, avgör hur många kartregister som måste användas för att tillhandahålla en virtuell till logisk mappning för den gemensamma bufferten. Använd makrot BYTES_TO_PAGES för att fastställa det maximala antalet sidor som behövs (BYTES_TO_PAGES (LengthForBuffer)). Det här värdet får inte vara större än de NumberOfMapRegisters som returneras av IoGetDmaAdapter.
Dessutom måste anroparen ange följande:
Ett booleskt värde som anger om cachelagring ska aktiveras
Obs Det här värdet ignoreras. Operativsystemet avgör om cachelagrat minne ska aktiveras i den gemensamma buffert som ska allokeras. Det beslutet baseras på processorarkitekturen och enhetsbussen.
På datorer med x86-baserade, x64-baserade och Itanium-baserade processorer aktiveras cachelagrat minne.
På datorer med Arm- eller Arm 64-baserade processorer aktiverar operativsystemet inte automatiskt cachelagrat minne för alla enheter. Systemet förlitar sig på ACPI_CCA-metoden för varje enhet för att avgöra om enheten är cachekonsektent.
En pekare till en drivrutinsdefinierad variabel som innehåller den enhetstillgängliga logiska basadressen för bufferten (BufferLogicalAddress i föregående diagram) vid retur från AllocateCommonBuffer
Om anropet lyckas returnerar AllokeraCommonBuffer en drivrutinstillgänglig bas-virtuell adress för bufferten (BufferVirtualAddress i föregående diagram), som drivrutinen måste spara i enhetstillägget, kontrollanttillägget eller annat förartillgängligt lagringsområde (icke-sidsidig pool som allokerats av drivrutinen).
AllokeraCommonBuffer returnerar NULL om det inte kan allokera minne för bufferten. Om den returnerade virtuella basadressen är NULL måste drivrutinen antingen använda systemets paketbaserade DMA-stöd exklusivt eller så måste drivrutinen misslyckas med IRP_MN_START_DEVICE begäran och returnera STATUS_INSUFFICIENT_RESOURCES.
Annars kan drivrutinen använda den allokerade gemensamma bufferten som ett drivrutins- och adaptertillgängligt lagringsområde för DMA-överföringar.
När PnP-chefen skickar en IRP som stoppar eller tar bort enheten måste drivrutinen anropa FreeCommonBuffer för att frigöra varje gemensam buffert som den har allokerat.