Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 garantias, expressas ou implícitas, em relação às informações fornecidas aqui.
Há momentos em que certas operações precisam ser realizadas numa alocação que está prestes a passar por uma operação de evicção ou promoção de página. Por exemplo, uma alocação pode ser compactada quando está sob acesso de um dispositivo. Quando essa alocação está a ser removida (ou seja, não está mais sob acesso ao dispositivo), o driver de modo kernel (KMD) deve primeiro descompactá-la antes da remoção real. A operação de paginação DXGK_OPERATION_NOTIFY_ALLOC é projetada para essa finalidade. Esta operação está disponível a partir do Windows 11, versão 24H2 (WDDM 3.2).
Como solicitar notificações de atribuição
Quando o sistema chama DxgkDdiCreateAllocation para criar uma alocação, o KMD pode definir sinalizadores em DXGK_ALLOCATIONINFOFLAGS2 para instruir Dxgkrnl a executar a operação de paginação DXGK_OPERATION_NOTIFY_ALLOC. Os sinalizadores de notificação atuais são:
- Notificar Despejo
- NotifyIoMmuUnmap
Alterações no DDI
A operação de paginação DXGK_OPERATION_NOTIFY_ALLOC foi adicionada
A operação de paginação DXGK_OPERATION_NOTIFY_ALLOC é adicionada ao DXGK_BUILDPAGINGBUFFER_OPERATION.
A estrutura DXGK_BUILDPAGINGBUFFER_NOTIFYALLOC é adicionada para uso com a operação DXGK_OPERATION_NOTIFY_ALLOC .
Bandeiras adicionadas ao DXGK_ALLOCATIONINFOFLAGS2
Os sinalizadores a seguir são adicionados ao DXGK_ALLOCATIONINFOFLAGS2.
Notificar Despejo
O KMD define o indicador NotifyEviction na sua implementação DxgkDdiCreateAllocation. Este indicador indica que Dxgkrnl deve emitir uma operação DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction para o driver antes de desalojar uma alocação.
Quando a bandeira é especificada e a alocação está prestes a ser removida:
- Dxgkrnl mapeia a alocação para o espaço de endereço virtual (VA) da GPU no processo de paginação.
- Dxgkrnl chama DxgkDdiBuildPagingBuffer com a operação DXGK_OPERATION_NOTIFY_ALLOC e o sinalizador NotifyEviction .
- O driver cria comandos no buffer DMA de paginação.
- O buffer DMA de paginação é submetido para execução no contexto do sistema.
- Dxgkrnl desmapeia a alocação do espaço VA da GPU do processo de paginação.
Essas etapas podem ser executadas várias vezes se o tamanho da alocação for maior do que o tamanho do espaço VA da GPU do processo de paginação.
Dxgkrnl envia a notificação para o driver somente quando uma alocação é removida de um segmento de abertura ou do segmento implícito de memória do sistema.
NotifyIoMmuUnmap
KMD define o indicador NotifyIoMmuUnmap na 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 chance de limpar caches internos. O driver deve garantir que a alocação GPU VA não seja acessada após o retorno da operação de paginação.
Quando a bandeira é especificada e a alocação está prestes a ser desmapeada da IOMMU durante a remoção:
- Dxgkrnl invoca DxgkDdiBuildPagingBuffer com a operação DXGK_OPERATION_NOTIFY_ALLOC e a flag NotifyIoMmuUnmap.
- O driver cria comandos no buffer DMA de paginação.
- O buffer DMA de 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 da IOMMU.
A notificação é enviada somente quando o dispositivo suporta modelos de endereçamento virtual GpuVaIoMmu ou GpuVaIoMmuGlobal.
Tamanho do espaço VA do GPU no processo de paginação
Para obter o tamanho do espaço VA da GPU do processo de paginação, DXGKQAITYPE_PAGINGPROCESSGPUVASIZE é adicionado à enumeração DXGK_QUERYADAPTERINFOTYPE.
A operação DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction requer que a alocação correspondente seja mapeada para o espaço VA da GPU do processo de paginação. Dxgkrnl aloca o espaço VA da GPU para o processo de paginação (sistema) somente quando há um segmento de memória local ou quando o agendamento de hardware está habilitado. O tamanho do espaço VA da GPU é um quarto do maior segmento de memória local ou o tamanho dos buffers de log de agendamento de hardware, o que for maior. O tamanho VA da GPU resultante 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.
Dxgkrnl chama DxgkDdiQueryAdapterInfo com uma estrutura DXGKARG_QUERYADAPTERINFO da seguinte forma para obter o tamanho do espaço VA da GPU do processo de paginação:
- O tipo está definido DXGKQAITYPE_PAGINGPROCESSGPUVASIZE.
- pInputData aponta para um valor UINT que especifica o índice do adaptador físico em uma configuração LDA. Dxgkrnl define como zero para configurações não-LDA.
-
InputDataDataSize é
sizeof(UINT). - 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.
-
OutputDataSize é
sizeof(UINT).
Se o driver falhar na chamada ou retornar um valor pOutputData de zero, o sistema operacional determinará o tamanho do VA da GPU do processo de paginação.
Se um adaptador tiver um grande segmento de memória local, o driver deve retornar zero para permitir que o sistema operativo escolha o tamanho do espaço de endereço virtual (VA) da GPU para o processo de paginação. Quanto maior o espaço VA, mais memória é necessária para gerir o processo de paginação das tabelas de páginas da GPU. As tabelas de página são sempre residentes, portanto, o driver não deve especificar um tamanho grande desnecessário para o espaço VA.
As operações de paginação (preencher, transferir, notificar alocação) são feitas em partes quando o tamanho da alocação excede o tamanho do espaço VA da GPU do processo de paginação.