Compartir a través de


Notificación de asignación

Importante

Parte de la información hace referencia a un producto de versión preliminar que puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no proporciona ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.

Hay ocasiones en las que es necesario realizar determinadas operaciones en una asignación que está a punto de someterse a una operación de expulsión o promoción de paginación. Por ejemplo, una asignación puede comprimirse cuando está bajo acceso al dispositivo. Cuando se expulsa esa asignación (es decir, ya no está bajo acceso al dispositivo), el controlador en modo kernel (KMD) primero debe descomprimirla antes de la expulsión real. La operación de paginación DXGK_OPERATION_NOTIFY_ALLOC está diseñada para este fin. Esta operación está disponible a partir de Windows 11, versión 24H2 (WDDM 3.2).

Cómo solicitar notificaciones de asignación

Cuando el sistema llama a DxgkDdiCreateAllocation para crear una asignación, el KMD puede establecer marcas en DXGK_ALLOCATIONINFOFLAGS2 para indicar a Dxgkrnl que realice la operación de paginación DXGK_OPERATION_NOTIFY_ALLOC. Las marcas de notificación actuales son:

  • NotifyEviction
  • NotifyIoMmuUnmap

Cambios de DDI

Operación de paginación DXGK_OPERATION_NOTIFY_ALLOC agregada

Marcas agregadas a DXGK_ALLOCATIONINFOFLAGS2

Las marcas siguientes se agregan a DXGK_ALLOCATIONINFOFLAGS2.

  • NotifyEviction

    El KMD establece la marca NotifyEviction en su implementación de DxgkDdiCreateAllocation. Esta marca indica que Dxgkrnl debe emitir una operación DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction al controlador antes de expulsar una asignación.

    Cuando se especifica la marca y la asignación está a punto de expulsarse:

    • Dxgkrnl asigna la asignación al espacio de direcciones virtuales (VA) de GPU del proceso de paginación.
    • Dxgkrnl llama a DxgkDdiBuildPagingBuffer con la operación DXGK_OPERATION_NOTIFY_ALLOC y la marca NotifyEviction.
    • El controlador compila comandos en el búfer DMA de paginación.
    • El búfer DMA de paginación se envía para su ejecución en el contexto del sistema.
    • Dxgkrnl anula la asignación de la asignación del espacio VA de GPU del proceso de paginación.

    Estos pasos se pueden ejecutar varias veces si el tamaño de asignación es mayor que el tamaño del espacio de VA de GPU del proceso de paginación.

    Dxgkrnl envía la notificación al controlador solo cuando se expulsa una asignación de un segmento de apertura o del segmento de memoria del sistema implícito.

  • NotifyIoMmuUnmap

    El KMD establece la marca NotifyIoMmuUnmap en su función DxgkDdiCreateAllocation. Esta marca indica que Dxgkrnl debe emitir una operación DXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap antes de anular la asignación de IOMMU. El controlador tiene la oportunidad de borrar las memorias caché internas. El controlador debe asegurarse de que no se tiene acceso a la VA de GPU de asignación después de volver desde la operación de paginación.

    Cuando se especifica la marca y la asignación está a punto de anularse de IOMMU durante la expulsión:

    • Dxgkrnl llama a DxgkDdiBuildPagingBuffer con la operación DXGK_OPERATION_NOTIFY_ALLOC y la marca NotifyIoMmuUnmap.
    • El controlador compila comandos en el búfer DMA de paginación.
    • El búfer DMA de paginación se envía para su ejecución en el contexto del sistema.
    • Dxgkrnl espera a que finalicen todas las operaciones de paginación.
    • La asignación se anula de IOMMU.

    La notificación solo se envía cuando el dispositivo admite modelos de direccionamiento virtual GpuVaIoMmu o GpuVaIoMmuGlobal.

Tamaño del espacio de VA de GPU del proceso de paginación

Para obtener el tamaño del espacio VA de GPU del proceso de paginación, DXGKQAITYPE_PAGINGPROCESSGPUVASIZE se agrega a la enumeración DXGK_QUERYADAPTERINFOTYPE.

La operación DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction requiere que la asignación correspondiente se asigne al espacio de VA de GPU del proceso de paginación. Dxgkrnl asigna el espacio VA de GPU para el proceso de paginación (sistema) solo cuando hay un segmento de memoria local o cuando está habilitada la programación de hardware. El tamaño del espacio VA de GPU es un cuarto del segmento de memoria local más grande o el tamaño de los búferes de registro de programación de hardware, el que sea mayor. El tamaño de VA de GPU resultante podría ser pequeño para asignar una asignación completa. En este caso, el controlador debe especificar el tamaño del espacio VA de GPU del proceso de paginación.

Dxgkrnl llama a DxgkDdiQueryAdapterInfo con una estructura DXGKARG_QUERYADAPTERINFO como se indica a continuación para obtener el tamaño del espacio VA de GPU del proceso de paginación:

  • El Type se establece en DXGKQAITYPE_PAGINGPROCESSGPUVASIZE.
  • pInputData apunta a un valor UINT que especifica el índice del adaptador físico en una configuración de LDA. Dxgkrnl lo establece en cero para configuraciones que no son de LDA.
  • InputDataDataSize es sizeof(UINT).
  • pOutputData apunta a un valor UINT en que el controlador devuelve el tamaño del espacio VA de GPU del proceso de paginación en megabytes.
  • OutputDataSize es sizeof(UINT).

Si el controlador produce un error en la llamada o devuelve un valor pOutputData de cero, el sistema operativo determina el tamaño de VA de GPU del proceso de paginación.

Si un adaptador tiene un segmento de memoria local grande, el controlador debe devolver cero para permitir que el sistema operativo elija el tamaño del espacio VA de GPU del proceso de paginación. Cuanto mayor sea el espacio de VA, más memoria se necesita para las tablas de páginas de GPU del proceso de paginación. Las tablas de páginas son siempre residentes, por lo que el controlador no debería especificar un tamaño innecesariamente grande para el espacio VA.

Las operaciones de paginación (relleno, transferencia, asignación de notificaciones) se realizan en fragmentos cuando un tamaño de asignación supera el tamaño del espacio de VA de GPU del proceso de paginación.