> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Uso de memória do kernel

> Uso de memória do kernel

No Windows e no Microsoft Game Development Kit (GDK), a memória do kernel existe como um único pool compartilhado pelo kernel e por todos os drivers. A memória do kernel é sempre alocada a partir da partição do sistema.

A maior parte dos requisitos de memória do kernel é responsabilidade da plataforma e, portanto, não é cobrada do orçamento de memória do título.

No entanto, a lista a seguir mostra quando o código do jogo é diretamente responsável pelo uso de memória do kernel.

* Estruturas de rastreamento para cada reserva de memória virtual
* Manipulação de arquivos, eventos e objetos de sincronização de threads
* Rede

Espera-se que os títulos forneçam memória para o uso do kernel pelo qual são diretamente responsáveis. Como a memória do kernel existe como um único pool, as alocações não são "divisíveis" da mesma forma que o uso da plataforma e do título é dividido para binários e heaps.

Em vez disso, um mecanismo diferente é usado para permitir que os desenvolvedores forneçam a memória necessária de forma determinística.

O sistema operacional aloca quase toda a memória do kernel que consome como parte da sequência de inicialização do sistema operacional do Microsoft Game Development Kit (GDK). Após a inicialização, as variações típicas do uso da plataforma ficam em torno de 1 a 2 MB.

Quando um processo de título é iniciado, o consumo atual de memória do kernel é consultado e um "piso de ruído" é estabelecido 16 MB acima do consumo atual de memória do kernel.

O valor é estabelecido para que, quando o limite for ultrapassado, isso seja resultado direto do comportamento do título, e não da variação normal do sistema operacional.

O monitoramento é implementado por meio da instrumentação das seguintes APIs, que sabidamente resultam em alocações de memória do kernel.

* `CreateFile`
* `CreateEvent`
* `CreateSemaphore`

Se uma chamada a uma dessas APIs ocorrer enquanto o uso de memória do kernel estiver se aproximando do limite ou já o tiver excedido, informações adicionais serão fornecidas por meio de `XError` e do fluxo de depuração.

Se o uso de memória do kernel tiver excedido o limite, a chamada à API falhará com um valor de `GetLastError()` igual a `ERROR\_NOT\_ENOUGH\_MEMORY`.

A saída de diagnóstico pode ser visualizada em um depurador anexado, no *xbwatson.exe* e no *xbdbgmon.exe*.

### Aviso (em 14 MB)

A saída a seguir aparece quando um aviso é disparado em 14 MB.

```text theme={null}
XERROR: HR:8007000E threadID:1096 WARNING: Title is consuming significant kernel pool memory. 
Use XMemGetWorkingSetStatistics to review usage and XMemTransferMemory to raise the quota.
```

### Erro (em 16 MB)

A saída a seguir aparece quando um erro é disparado em 16 MB.

```text theme={null}
\[XMEM\]: Initial Kernel Pool Usage: 19628032  
\[XMEM\]: Current Kernel Pool Usage: 36683776  
\[XMEM\]: Kernel Pool Limit: 36405248
  
Top Consumers:
```

A tabela a seguir mostra o formato da marca de pool (Pool Tag).

| Marca | PagedAllocs | PagedFrees | PagedUsed | NonPagedAllocs | NonPagedFrees | NonPagedUsed |
| - | - | - | - | - | - | - |
| Even | 0 | 0 | 0 | 238750 | 219461 | 2469856 |
| Thre | 0 | 0 | 0 | 385 | 130 | 620160 |
| Mdl | 0 | 0 | 0 | 3843 | 3079 | 740080 |
| MmRe | 318 | 159 | 693520 | 0 | 0 | 0 |
| MmSt | 563 | 132 | 6133760 | 0 | 0 | 0 |
| File | 185 | 2 | 1096096 | 0 | 0 | 0 |
| TcDM | 0 | 0 | 0 | 1078 | 681 | 1587104 |
| AfdB | 0 | 0 | 0 | 86 | 35 | 1623152 |
| Mmww | 0 | 0 | 0 | 5503 | 705 | 530272 |
| Xvnc | 0 | 0 | 0 | 13 | 6 | 1448784 |
| XFSd | 0 | 0 | 0 | 1473 | 927 | 537040 |
| Sema | 0 | 0 | 0 | 12766 | 150 | 1615552 |

O erro a seguir também aparece.

```text theme={null}
XERROR: HR:8007000E threadID:1164 ERROR: Title has exhausted kernel pool
quota. Common consumers include handles, thread sync. objects, and
virtual address reservations. Use XMemTransferMemory to raise the quota.
```

Todas as alocações de memória do kernel recebem uma marca (semelhante à marcação com `XMEM\_MAKE\_TAG` e `XMemVirtualAlloc`) para indicar o uso da memória. A marca pode ajudar a determinar a origem do uso de memória.

A tabela a seguir mostra as marcas de "alta utilização" mais comuns relacionadas ao uso pelo título.

| Marca | Finalidade |
| - | - |
| `Even` | Objetos de evento alocados com `CreateEvent`. |
| `File` | Identificadores de arquivo alocados por `CreateFile`. |
| `Sema` | Objetos de semáforo alocados por `CreateSemaphore`. |
| `Mmww` | Bitmaps de "Write Watch" alocados para qualquer `MEM\_RESERVE` de memória gráfica para dar suporte a capturas de GPU do Performance Investigator for XBOX (PIX). |
| `MmSt`, `Mdl` | Estruturas de controle usadas pelo MM para acompanhar alocações de páginas físicas (`XMemAllocatePhysicalPages`, `XMemMapPhysicalPages`) e quaisquer mapeamentos de arquivo (`CreateFileMapping`, bem como quaisquer arquivos .dll ou .exe carregados. |
| `XFSk`, `XFsm` | Memória usada pelo XRFS, o driver de sistema de arquivos Win32 usado para implantações de arquivos soltos (Loose) e cenários de execução a partir do PC (Run-from-PC). |
| `TcDM`, `AfdB` | Memória usada pelo driver de rede. |

A memória do kernel é dividida em duas categorias amplas chamadas "Non Paged" (não paginada) e "Paged" (paginada). No Microsoft Game Development Kit (GDK), não há diferença funcional entre essas categorias, e elas podem ser tratadas como sinônimos.

## Custos comuns de memória do kernel

As tabelas a seguir mostram os custos esperados de memória do kernel de cada ação listada.

| Ação | Custo |
| - | - |
| Abrir um arquivo | Aproximadamente 2 KB por identificador de arquivo |
| Eventos e semáforos | 128 bytes por evento ou semáforo (ou 12 MB por 100.000) |
| Reservas de endereço virtual | 80 bytes cada (ou 7,5 MB por 100.000) |
| `XMemAllocatePhysicalPages` | 128 bytes por página física de 64 KB |

## Aumentar o limite

Títulos menores podem ter um uso de memória que cabe nos limites existentes. No entanto, títulos maiores precisam receber memória para dar suporte ao seu uso de memória do kernel.

A API [XMemTransferMemory](/pt-BR/reference/system/xmem/functions/xmemtransfermemory) é usada para fornecer a memória necessária.

## Criar perfil do uso do pool do kernel

O suporte no PIX para monitorar o uso do pool do kernel não está disponível. É possível monitorar o consumo usando o xperf e o Windows Performance Analyzer (WPA).

Use as etapas a seguir para criar o perfil da memória do kernel.

1. Insira o comando `xbrun /x/title xperf -start -on PROC_THREAD+LOADER+POOL -stackwalk PoolAlloc+PoolFree -f d:\krnl.etl`
2. Execute o cenário do título.
3. Insira o comando `xbrun /x/title xperf -stop -d d:\krnl.merged.etl`
4. Insira o comando `xbcp xd:\krnl.merged.etl %TEMP%\pool_usage.etl`
5. Abra o arquivo *pool\_usage.etl* no WPA e conduza a análise conforme mostrado na figura 1.

**Figura 1. Mostra a análise do pool de memória do kernel no WPA.**

<img src="https://mintcdn.com/microsoft-4404708b/CwRBzaXvHw9zaPoe/images/gdk/features/console/KernelMemoryWPA.png?fit=max&auto=format&n=CwRBzaXvHw9zaPoe&q=85&s=444da8b2e7d960f62fdf47f38c3fff12" alt="Captura de tela da análise do pool de memória do kernel no WPA" width="1185" height="441" data-path="images/gdk/features/console/KernelMemoryWPA.png" />


## Related topics

- [Diretório de tópicos NDA: links ativos do Microsoft Learn](/pt-BR/nda/nda-topic-directory.md)
- [XR-013 Vinculação de contas Microsoft a contas do publisher](/pt-BR/publishing/certification/xr/xr-013.md)
- [Optimización guiada por perfiles en Visual Studio](/es/tools/tools-console/pgo/pgo_full.md)
- [Introducción a Windows Sockets en el GDK](/es/build/console-features/networking/game-mesh/winsock-intro-networking.md)
- [Sistema de memoria para títulos del GDK de XBOX](/es/build/console-features/memory/index.md)
