NdisMAllocateSharedMemory
9/8/2008
Essa função aloca e mapeia um intervalo memória hospedar de forma que é simultaneamente acessível a partir de sistema e um mestre barramento direcionar memória acessar (acesso direto à memória (DMA)) rede interface cartão (NIC).
Syntax
VOID NdisMAllocateSharedMemory(
NDIS_HANDLE MiniportAdapterHandle,
ULONG Length ,
BOOLEAN Cached,
PVOID* VirtualAddress,
PNDIS_PHYSICAL_ADDRESS PhysicalAddress
);
Parameters
- MiniportAdapterHandle
[no] Especifica a entrada identificador para o MiniportInitialize função.
- Comprimento
[no] Especifica o número de bytes para alocar.
- Em cache
[no] Especifica TRUE se o intervalo pode ser alocado de memória em cache.
- VirtualAddress
[out] Aponta para uma variável Caller-supplied no qual essa função retorna o endereço virtual de base da alocação para usar a miniporta. Se NdisMAllocateSharedMemory Não é possível atender seu chamador, ele retorna NULL para indicar que nenhuma memória foi alocada.
- PhysicalAddress
[out] Aponta para uma variável Caller-supplied no qual essa função retorna um físico, adequado para uso pelo NIC, que corresponde ao que retornado no endereço VirtualAddress, ou ele retorna NULL.
Return Value
Nenhum.
Remarks
NdisMAllocateSharedMemory fornece dois o mapeada virtual intervalo do endereço que o driver usa para acessar o bloco memória compartilhada e o NDIS_PHYSICAL_ADDRESS intervalo tipo que usa a NIC. Um valor retornado no PhysicalAddress Pode ser mapeada doubly, o sistema. That is, um físico intervalo do endereço descrito pelo valor no PhysicalAddress e Comprimento Pode ser um intervalo de endereços lógicos mapeados que não correspondem a hospedar físico endereços para a alocação em cada plataforma possível.
NdisMAllocateSharedMemory pode ser chamado somente a partir MiniportInitialize. Você pode decidir como grande uma alocação a solicitação com base em como o gravador driver, decide fazer a compensação entre a seguinte desempenho versus tamanho dilema:
- Em períodos de tráfego de rede alta, uma miniporta não é possível manter alta taxa de transferência E/S se ela for executada baixa no espaço memória Compartilhada para dispositivo-acessível buffers dados.
Para exemplo, a miniporta poderia ser indicando Receber buffers na memória compartilhada mais rapidamente do que esses buffers estão sendo retornados de ligado protocolos quando recebe uma sobrecarga de chegar no seu NIC. Se todos os seu espaço memória compartilhada é consumido por pendente Receber buffers, a miniporta talvez precise desativar receber interrupções no seu NIC até que ele tem alguns memória compartilhada espaço disponível para buffers de recepção. - Por outro lado, chamado NdisMAllocateSharedMemory Com um Comprimento parâmetro escolhido para prever alguns demanda transferir máximo faz imagem do driver maior e seu uso recurso bastante uneconomical, exceto por raros períodos de muito alta demanda E/S. Além disso, NdisMAllocateSharedMemory pode não fornecer o driver tal um bloco grande se sistema insuficiência de memória está disponível, forçando o driver falha inicialização.
NdisMAllocateSharedMemory é o único NDISXXX função que pode ser chamado para alocar memória hospedar que é compartilhada entre o driver, que usa endereços virtuais e um mestre barramento NIC, que usa o correspondente endereços lógicos.
Sempre que possível, um driver NIC chamadas NdisMAllocateSharedMemory Com Em cache Definir como TRUE porque sua solicitação é mais provável que tenha êxito. Em qualquer plataforma, memória noncached é sempre um recurso sistema escasso. Geralmente, os drivers podem get maior alocações de memória em cache as well. Um driver NIC deve alocar espaço sua memória compartilhada de memória noncached se qualquer uma do seguinte for verdadeiro:
- O NIC ou miniporta grava diretamente no buffers de recebimento antes de miniporta indica os dados recém-recebidos.
Para exemplo, um NIC que Define sinalizadores em cada quadro recebido após ele foi transferido deve ter acessar Receber buffers na memória noncached. Caso contrário, a miniporta não pôde determinar quando ele deve emitir um liberado para manter coerência armazenar em cache: Ambos a miniporta levaria um desempenho ocorrência por aguardando um intervalo com recurso de segurança contra falhas para liberado a buffer de recepção em cache ou a miniporta tornaria indicações no qual os sinalizadores quadro aleatoriamente foram definidos. - O NIC transfere alguns número de quadros recebidos em seqüência em contíguo físico memória no espaço de memória compartilhada.
Se tal um NIC transferidos de entrada memória em cache quadros em contíguo, seu driver não é possível manter integridade dados para todos esses quadros quando qualquer quadro pode participam um limite cache-Line. Quando a miniporta liberado o intervalo para tal um quadro, ele também pode liberado o espaço armazenar em cache contendo parte o próximo quadro se ele foi transferido já, tornando assim que próximo quadro incoerentes.
Uma miniporta deve alinhar os buffers ele aloca de compartilhada memória em cache em uma integral da hospedar dados - armazenar em cache - linha de limite para evitar cache-linha tearing durante acesso direto à memória (DMA). Cache-linha tearing pode causar problemas integridade dados no driver ou prejudicar do driver (e do sistema) desempenho E/S exigindo dados excessivos-armazenar em cache liberando para manter dados integridade. MiniportInitialize pode chamar NdisGetCacheFillSize Para determinar o limite alinhamento na atual plataforma para dispositivo-acessível buffers se o driver será configurado em um intervalo alocado da memória compartilhada.
MiniportInitialize Também pode chamar NdisSystemProcessorCount antes de ele chama NdisMAllocateSharedMemory Se o gravador driver decide alocar uma maior compartilhada bloco de memória em multiprocessador máquinas na suposição de que qualquer máquina SMP é provável que seja um servidor rede com maior rede-demandas transferir sobre a NIC de um estação de trabalho.
Se MiniportInitialize Foi não especificar que o NIC é um mestre barramento quando ele chamado NdisMSetAttributes Ou NdisMSetAttributesEx, NdisMAllocateSharedMemory simplesmente retorna controle sem tentar tornar uma alocação.
Se seu chamar para NdisMAllocateSharedMemory falhar, MiniportInitialize pode chamar novamente solicitando um menor alocação. No entanto, se MiniportInitialize Não é possível alocar memória compartilhada suficiente para o NIC, ele deve versão todos os recursos ele já alocada e inicialização falhar.
Se o driver NIC subseqüentemente indica recebe com NdisMIndicateReceivePacket, ele deve alocar algum número de descritores reserva do pool reserva buffers de recepção do que mapa (n.); mapear (v.) o NIC no bloco de memória compartilhada.
Se a memória alocada é armazenado em cache e, portanto, precisa ser liberado no transferências, a miniporta deve chamar NdisAllocateBuffer Para alocar um NDIS_BUFFER descritor de tipo para o intervalo memória compartilhada. O driver NIC deve chamar NdisFlushBuffer Com esse descritor reserva para executar tal um liberado. Além disso, esse uma miniporta deve chamar NdisMUpdateSharedMemory Para assegurar integridade dados em todas as plataformas possíveis.
Qualquer miniporta que chama NdisMAllocateSharedMemory Deve versão pendente todas as alocações com um ou mais chamadas para NdisMFreeSharedMemory Quando seu NIC é removido; Isto é, quando seu MiniportHalt função é chamado.
Requirements
Header | ndis.h |
Library | ndis.dll |
Windows Embedded CE | Windows CE .NET 4.0 and later |
See Also
Reference
MiniportHalt
MiniportInitialize
NdisAllocateBuffer
NdisFlushBuffer
NdisGetCacheFillSize
NdisMFreeSharedMemory
NdisMIndicateReceivePacket
NdisMSetAttributes
NdisMSetAttributesEx
NdisMUpdateSharedMemory
NdisSystemProcessorCount