Direct Memory Access
9/8/2008
Acessar memória direto (acesso direto à memória (DMA)) é um método de transferir dados de um dispositivo para memória, da memória para um dispositivo ou de memória para memória, sem a ajuda de um microprocessador. Você pode executar comum reserva e dispersão/coletar acesso direto à memória (DMA) usando as funções CEDDK.dll ou kernel. Reserva comuns acesso direto à memória (DMA) usa um contíguo reserva na memória principal. Dispersão/coletar acesso direto à memória (DMA) usa múltiplo blocos na memória diferentes endereços. Para obter mais informações sobre as funções CEDDK.dll, consulte Biblioteca de Vínculo Dinâmico CEDDK.
Um padrão acesso direto à memória (DMA) transferir ocorre quando um controlador acesso direto à memória (DMA) desempenha a transferir. Um mestre barramento acesso direto à memória (DMA) transferir ocorre quando um dispositivo periférico realiza a transferir. Microsoft recomenda que você use as funções CEDDK.dll para acesso direto à memória (DMA). Chamar a funções CEDDK.dll as funções kernel. A seguinte tabela compara duas maneiras de executar acesso direto à memória (DMA): Usando funções CEDDK.dll e funções kernel. **
Observação
O método transferir acesso direto à memória (DMA) descrito a seguir foi substituído por uma nova biblioteca de abstração acesso direto à memória (DMA) em Windows Embedded CE 6.0. A biblioteca de abstração acesso direto à memória (DMA) deve ser usada em local do método descrita abaixo. Para obter mais informações sobre a biblioteca de abstração acesso direto à memória (DMA), consulte Direct Memory Access Abstraction
Usando funções CEDDK.dll | Usando funções kernel |
---|---|
CEDDK.dll fornece essas funções para obter uma reserva para transferências acesso direto à memória (DMA): |
O kernel oferece essas funções para obter uma reserva para transferências acesso direto à memória (DMA): |
Funções CEDDK.dll podem identificador barramento e traduções endereço Platform-specific hardware. |
Você deve conversões endereço Platform-specific hardware identificador. Você pode chamar HalTranslateSystemAddress Para traduzir o endereço. |
Funções CEDDK.dll são úteis para comum reserva acesso direto à memória (DMA). |
As funções kernel podem ser útil para dispersão/coletar acesso direto à memória (DMA). |
Funções CEDDK.dll usam um alinhamento memória usar como padrão de 64 KB. |
As funções kernel permitem que você alteração o alinhamento memória usar como padrão. |
As CEDDK.dll funções identificador endereço conversões entre o sistema e o barramento PCI ou barramento ISA para o controlador acesso direto à memória (DMA). Você pode suporte outros tipos barramento. As funções CEDDK.dll traduzem um físico endereço memória RAM para o correspondente barramento-relativo físico endereço para o controlador acesso direto à memória (DMA). Para configurar um comum reserva de barramento mestre usando as funções, um mestre barramento CEDDK.dll acesso direto à memória (DMA) driver de dispositivo acesso direto à memória (DMA) pode chamar HalAllocateCommonBuffer Com o DMA_ADAPTER_OBJECT estrutura.
O seguinte exemplo de código mostra um chamar correto para HalAllocateCommonBuffer. O exemplo de código é proveniente de driver ES1371 localizado no Diretório %_WINCEROOT%\Public\Common\OAK\Drivers\WaveDev\PDD\ES1371.
// Allocate an adapter object on the stack
DMA_ADAPTER_OBJECT AdapterObject;
AdapterObject.ObjectSize = sizeof(AdapterObject);
AdapterObject.InterfaceType = PCIBus;
AdapterObject.BusNumber = 0;
// Allocate a single paged 4 KB output buffer
dma_out_page[0] = (PUCHAR) HalAllocateCommonBuffer(&AdapterObject, 4096, &dma_out_logical_address, FALSE);
if (!dma_out_page[0]) {
ERRMSG("PDD_AudioInitialize: DMA Buffer Page Allocation Failed");
return FALSE;
}
Se a chamar para HalAllocateCommonBuffer for bem-sucedido, ele retornará a reserva alocada, ou NULL se o chamar falhar. O driver pode usar o comum alocado reserva como uma área armazenamento para transferências acesso direto à memória (DMA). A função também retorna o físico barramento-relativo endereço da reserva, o qual a função opcionalmente fornece para o controlador acesso direto à memória (DMA).
Você também pode usar o AllocPhysMem e FreePhysMem funções kernel para comum reserva transfere acesso direto à memória (DMA). Se você usar as funções kernel, chamar HalTranslateSystemAddress Para traduzir o endereço está passando para o controlador acesso direto à memória (DMA) para evitar uma violação memória. Essas funções tomar um parâmetro alinhamento, as funções CEDDK.dll usam alinhamento usar como padrão de 64 KB. Para um comum reserva acesso direto à memória (DMA) exemplo com funções de kernel, consulte o Diretório %_WINCEROOT%\Public\Common\Oak\Drivers\Usb\Hcd.
Para configurar dispersão/coletar acesso direto à memória (DMA), você deve usar múltiplo pares de endereços de base e comprimentos simultaneamente. O driver ATAPI localizado no Diretório %_WINCEROOT%\Public\Common\Oak\Drivers\Block\Atapi é um exemplo de dispersão/coletar acesso direto à memória (DMA) implementação.