Notificação de localização
Importante
Algumas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.
Há momentos quando certas operações precisam ser executadas em uma alocação que está prestes a passar por uma operação de remoção ou promoção de paginação. Por exemplo, uma alocação pode ser compactada quando está sujeita a acesso ao dispositivo. Quando essa alocação está sendo removida (ou seja, não está mais sujeita a acesso ao dispositivo), o KMD (driver do modo kernel) deve primeiro descompactá-la antes da remoção real. A operação de paginação DXGK_OPERATION_NOTIFY_ALLOC foi criada para essa finalidade. Essa operação está disponível a partir do Windows 11, versão 24H2 (WDDM 3.2).
Como solicitar notificações de alocação
Quando o sistema chama o DxgkDdiCreateAllocation para criar uma alocação, o KMD pode estabelecer sinalizadores em DXGK_ALLOCATIONINFOFLAGS2 para instruir o Dxgkrnl a executar a operação de paginação DXGK_OPERATION_NOTIFY_ALLOC. Os atuais sinalizadores de notificação são:
- NotifyEviction
- NotifyIoMmuUnmap
Alterações de DDI
Operação de paginação DXGK_OPERATION_NOTIFY_ALLOC adicionada
A operação de paginação DXGK_OPERATION_NOTIFY_ALLOC é adicionada à DXGK_BUILDPAGINGBUFFER_OPERATION.
A estrutura DXGK_BUILDPAGINGBUFFER_NOTIFYALLOC é adicionada para ser usada com a operação DXGK_OPERATION_NOTIFY_ALLOC.
Sinalizadores adicionados a DXGK_ALLOCATIONINFOFLAGS2
Os seguintes sinalizadores são adicionados a DXGK_ALLOCATIONINFOFLAGS2.
NotifyEviction
O KMD especifica o sinalizador NotifyEviction em sua implementação de DxgkDdiCreateAllocation . Esse sinalizador indica que o Dxgkrnl deveria emitir uma operação de DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction para o driver antes de remover uma alocação.
Quando o sinalizador é especificado e a alocação está prestes a ser removida:
- O Dxgkrnl mapeia a alocação para o espaço de endereço virtual da GPU (VA) do processo de paginação.
- O Dxgkrnl chama DxgkDdiBuildPagingBuffer com a operação DXGK_OPERATION_NOTIFY_ALLOC e o sinalizador NotifyEviction.
- O driver cria comandos no buffer de DMA da paginação.
- O buffer de DMA da paginação é enviado para execução no contexto do sistema.
- O Dxgkrnl desmapeia a alocação do espaço VA da GPU do processo de paginação.
Se o tamanho da alocação for maior que o tamanho do espaço VA da GPU do processo de paginação, essas etapas podem ser executadas várias vezes.
O Dxgkrnl somente envia a notificação para o driver quando uma alocação é removida de um segmento de abertura ou do segmento de memória implícito do sistema.
NotifyIoMmuUnmap
O KMD define o sinalizador NotifyIoMmuUnmap em sua função DxgkDdiCreateAllocation. Esse sinalizador indica que o Dxgkrnl deve emitir uma operação DXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap antes de desmapear a alocação do IOMMU. O driver tem a possibilidade de limpar caches internos. O driver deve garantir que o VA da GPU de alocação não seja acessado após o retorno da operação de paginação.
Quando o sinalizador é especificado e a alocação está prestes a ser desmapeada do IOMMU durante a remoção:
- O Dxgkrnl chama DxgkDdiBuildPagingBuffer com a operação DXGK_OPERATION_NOTIFY_ALLOC e o sinalizador NotifyIoMmuUnmap.
- O driver cria comandos no buffer de DMA da paginação.
- O buffer de DMA da paginação é enviado para execução no contexto do sistema.
- Dxgkrnl aguarda a conclusão de todas as operações de paginação.
- A alocação não é mapeada do IOMMU.
A notificação é enviada apenas quando o dispositivo oferece suporte aos modelos de endereçamento virtual GpuVaIoMmu ou GpuVaIoMmuGlobal.
Tamanho do espaço VA da GPU do processo de paginação
Para obter o tamanho do espaço VA da GPU do processo de paginação, o DXGKQAITYPE_PAGINGPROCESSGPUVASIZE é adicionado à enumeração DXGK_QUERYADAPTERINFOTYPE.
A operação DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction exige que a alocação correspondente seja mapeada para o espaço VA da GPU do processo de paginação. O Dxgkrnl somente aloca o espaço VA da GPU para o processo de paginação (do sistema) quando houver um segmento de memória local ou quando o agendamento de hardware estiver habilitado. O tamanho do espaço VA da GPU é a quarta parte do maior segmento de memória local ou do tamanho dos buffers de log de agendamento de hardware, o que for maior. O tamanho de VA resultante da GPU pode ser pequeno para mapear uma alocação completa. Nesse caso, o driver precisa especificar o tamanho do espaço VA da GPU do processo de paginação.
Para obter o tamanho do espaço VA da GPU do processo de paginação, o Dxgkrnl chama o DxgkDdiQueryAdapterInfo com uma estrutura de DXGKARG_QUERYADAPTERINFO da seguinte maneira:
- O tipo é especifica como DXGKQAITYPE_PAGINGPROCESSGPUVASIZE.
- O pInputData aponta para um valor UINT, que especifica o índice do adaptador físico em uma configuração de LDA. Para configurações não LDA, ele é definido pelo Dxgkrnl como zero.
- O InputDataDataSize é
sizeof(UINT)
. - O pOutputData aponta para um valor UINT no qual o driver retorna o tamanho do espaço VA da GPU do processo de paginação em megabytes.
- O OutputDataSize é
sizeof(UINT)
.
Se o driver falhar na chamada ou retornar um valor pOutputData de zero, o sistema operacional determinará o tamanho de VA da GPU do processo de paginação.
Se um adaptador tiver um grande segmento de memória local, o driver deverá retornar zero, para permitir que o sistema operacional escolha o tamanho do espaço VA da GPU do processo de paginação. Quanto maior for o espaço do VA, mais memória será necessária para as tabelas de páginas da GPU do processo de paginação. As tabelas de páginas são sempre residentes, portanto, o driver não deveria especificar um tamanho grande desnecessário para o espaço VA.
Quando um tamanho de alocação excede o tamanho do espaço VA da GPU do processo de paginação, as operações de paginação (preenchimento, transferência, notificação de alocação) são feitas em partes.