Espaço do Usuário e Espaço do Sistema

O Windows fornece a cada aplicativo do modo de usuário um bloco de endereços virtuais. Isso é conhecido como o espaço do usuário desse aplicativo. O outro grande bloco de endereços, conhecido como espaço do sistema ou espaço em kernel, não pode ser acessado diretamente pelo aplicativo.

Quando WinDbg ou CDB define um ponto de interrupção no espaço do usuário, esse ponto de interrupção é definido no endereço especificado no espaço do usuário de um único processo. Durante a depuração do modo de usuário, o processo atual determina o significado dos endereços virtuais. Para obter mais informações, consulte Controlando processos e threads.

No modo kernel, você pode definir pontos de interrupção no espaço do usuário com os comandos bp, bu e ba ou com a caixa de diálogo Pontos de interrupção. Primeiro, você deve usar o contexto do processo para especificar o processo de modo de usuário que possui esse espaço de endereço usando .process /i (ou um ponto de interrupção específico do processo em alguma função de espaço de kernel) para alternar o destino para o contexto de processo correto.

Os pontos de interrupção no espaço do usuário são sempre associados ao processo cujo contexto de processo estava ativo quando os pontos de interrupção foram definidos. Se um depurador do modo de usuário estiver depurando esse processo e se um depurador de kernel estiver depurando o computador no qual o processo está sendo executado, esse ponto de interrupção será dividido no depurador do modo de usuário, mesmo que o ponto de interrupção tenha sido definido do depurador do kernel. Você pode invadir o sistema do depurador de kernel neste ponto ou usar o comando .breakin (Break to the Kernel Debugger) do depurador do modo usuário para transferir o controle para o depurador de kernel.

Determinando o intervalo de espaço do usuário e espaço do sistema

Se você precisar determinar a extensão do espaço do usuário e do espaço do sistema no computador de destino, poderá usar o comando dp (Display Memory) de um depurador de kernel para exibir a variável global do Windows MmHighestUserAddress. Essa variável contém o endereço da parte superior do espaço do usuário. Como os endereços de espaço do sistema são sempre maiores do que os endereços de espaço do usuário, esse valor permite determinar se determinado endereço está no espaço do usuário ou no espaço do kernel.

Por exemplo, em um computador de destino de 32 bits com um processador x86 e parâmetros de inicialização padrão, esse comando mostrará o seguinte resultado:

kd> dp nt!mmhighestuseraddress L1 
81f71864  7ffeffff 

Isso indica que o espaço do usuário varia do endereço 0x00000000 ao 0x7FFEFFFF e, portanto, o espaço do sistema varia de 0x80000000 até o endereço mais alto possível (que é 0xFFFFFFFF em uma instalação padrão do Windows de 32 bits).

Com um computador de destino de 64 bits, valores diferentes ocorrerão. Por exemplo, esse comando pode mostrar o seguinte:

0: kd> dp nt!mmhighestuseraddress L1 
fffff800`038b4010  000007ff`fffeffff 

Isso indica que o espaço do usuário varia de 0x00000000'00000000 a 0x000007FF'FFFEFFFF. Portanto, o espaço do sistema inclui todos os endereços de 0x00000800'00000000 para cima.

Para obter mais informações sobre o gerenciamento de memória do Windows, consulte Microsoft Windows Internals de David Solomon e Mark Russinovich (4ª edição, Microsoft Press, 2005).