次の方法で共有


ユーザー空間とシステム空間

Windows には、ユーザーモード アプリケーションごとに仮想アドレスのブロックがあります。 これは、そのアプリケーションのユーザー空間と呼ばれます。 システム空間またはカーネル領域と呼ばれる、別の大きなアドレス ブロックには、アプリケーションから直接アクセスすることはできません。

WinDbg または CDB がユーザー空間にブレークポイントを設定すると、このブレークポイントは、1 つのプロセスのユーザー空間内にある指定されたアドレスに設定されます。 ユーザーモードのデバッグ中に、現在のプロセスによって仮想アドレスの意味が決まります。 詳細については、「プロセスとスレッドの制御」を参照してください。

カーネル モードでは、bpbuba の各コマンドまたは [ブレークポイント] ダイアログ ボックスを使用して、ユーザー空間にブレークポイントを設定できます。 まずは、そのアドレス空間を所有するユーザーモード プロセスを .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'000000000 から上のすべてのアドレスが含まれます。

Windows メモリ管理の詳細については、David Solomon と Mark Russinovich による『Microsoft Windows Internals』(第 4 版、Microsoft Press、2005 年) を参照してください。