다음을 통해 공유


사용자 공간 및 시스템 공간

Windows는 각 사용자 모드 애플리케이션에 가상 주소 블록을 제공합니다. 이를 해당 애플리케이션의 사용자 공간 이라고 합니다. 시스템 공간 또는 커널 공간이라고 하는 다른 큰 주소 블록은 애플리케이션에서 직접 액세스할 수 없습니다.

WinDbg 또는 CDB가 사용자 공간에서 중단점을 설정하는 경우 이 중단점은 단일 프로세스의 사용자 공간에서 지정된 주소로 설정됩니다. 사용자 모드 디버깅 중에 현재 프로세스는 가상 주소의 의미를 결정합니다. 자세한 내용은 프로세스 및 스레드 제어를 참조하세요.

커널 모드에서는 bp, buba 명령을 사용하거나 중단점 대화 상자를 사용하여 사용자 공간에서 중단점을 설정할 수 있습니다. 먼저 프로세스 컨텍스트 를 사용하여 대상을 올바른 프로세스 컨텍스트로 전환하려면 .process /i (또는 일부 커널 공간 함수의 프로세스별 중단점)를 사용하여 해당 주소 공간을 소유하는 사용자 모드 프로세스를 지정해야 합니다.

사용자 공간의 중단점은 중단점이 설정되었을 때 프로세스 컨텍스트가 활성화된 프로세스와 항상 연결됩니다. 사용자 모드 디버거가 이 프로세스를 디버깅하고 커널 디버거가 프로세스가 실행 중인 컴퓨터를 디버깅하는 경우 중단점이 실제로 커널 디버거에서 설정되었음에도 불구하고 이 중단점은 사용자 모드 디버거로 중단됩니다. 이 시점에서 커널 디버거에서 시스템에 침입하거나 사용자 모드 디버거에서 .breakin(커널 디버거로 중단) 명령을 사용하여 제어를 커널 디버거로 전송할 수 있습니다.

사용자 공간 및 시스템 공간 범위 결정

대상 컴퓨터의 사용자 공간 및 시스템 공간 범위를 결정해야 하는 경우 커널 디버거의 dp(메모리 표시) 명령을 사용하여 Windows 전역 변수 MmHighestUserAddress를 표시할 수 있습니다. 이 변수에는 사용자 공간 맨 위의 주소가 포함됩니다. 시스템 공간 주소는 항상 사용자 공간 주소보다 높기 때문에 이 값을 사용하면 지정된 주소가 사용자 공간에 있는지 또는 커널 공간에 있는지 확인할 수 있습니다.

예를 들어 x86 프로세서 및 표준 부팅 매개 변수가 있는 32비트 대상 컴퓨터에서 이 명령은 다음 결과를 표시합니다.

kd> dp nt!mmhighestuseraddress L1 
81f71864  7ffeffff 

이는 사용자 공간이 주소 0x00000000 0x7FFEFFFF 범위이며 시스템 공간 범위가 0x80000000 최대 최대 주소(표준 32비트 Windows 설치에 0xFFFFFFFF)까지 다양하다는 것을 나타냅니다.

64비트 대상 컴퓨터의 경우 다른 값이 발생합니다. 예를 들어 이 명령은 다음을 표시할 수 있습니다.

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

이는 사용자 공간이 0x00000000'000000000에서 0x000007FF'FFFEFFFF까지의 범위를 나타냅니다. 따라서 시스템 공간에는 0x00000800'00000000 이상에서 온 모든 주소가 포함됩니다.

Windows 메모리 관리에 대한 자세한 내용은 David Solomon의 Microsoft Windows Internals 및 Mark Russinovich(4번째 버전, Microsoft Press, 2005)를 참조하세요.