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

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.