x86 アーキテクチャでは、デバッグ レジスタはプロセッサがプログラムの デバッグに使用するレジスタです。 デバッグ レジスタは 6 つあり、それぞれDR0 ... DR7と名付けられ、DR4 と DR5 は DR6 と DR7 の旧式な同義語です。 デバッグ レジスタを使用すると、プログラマは 4 つのデバッグ アドレス セットに関連付けられたさまざまなデバッグ条件を選択的に有効にすることができます。 これらのレジスタのうち 2 つは、デバッグ機能を制御するために使用されます。 これらのレジスタには、MOV 命令のバリアントによってアクセスします。 デバッグ レジスタは、ソース オペランドまたはデスティネーション オペランドのいずれかになります。 デバッグ レジスタは特権リソースです。デバッグ レジスタにアクセスする MOV 命令は、特権レベル0 でのみ実行できます。 その他の特権レベルで実行中にデバッグ レジスタの読み取りまたは書き込みを試みると、一般保護違反が発生します。
DR0からDR3
これらの各レジスタには、4 つのブレークポイント条件のいずれかに関連付けられた線形アドレスが含まれています。各ブレークポイント条件は、DR7 のビットによってさらに定義されます。
デバッグ アドレス レジスタは、ページングが有効かどうかに関係なく有効です。これらのレジスタ内のアドレスはリニア アドレスです。ページングが有効になっている場合、リニア アドレスはプロセッサのページング メカニズムによって物理アドレスに変換されます。ページングが有効になっていない場合、これらのリニア アドレスは物理アドレスと同じになります。
ページングが有効になっている場合、タスクによって線形アドレスと物理アドレスのマッピングが異なる場合があります。この場合、デバッグ アドレス レジスタ内のアドレスは、あるタスクには関連しますが、別のタスクには関連しない可能性があります。このため、x86 には DR7 にグローバル イネーブル ビットとローカル イネーブル ビットの両方があります。これらのビットは、特定のデバッグ アドレスがグローバル (すべてのタスク) に関連しているのか、ローカル (現在のタスクのみ) に関連しているのかを示します。
DR6 - デバッグステータス
デバッグ ステータス レジスタにより、デバッガはどのデバッグ条件が発生したかを判断できます。プロセッサは有効なデバッグ例外を検出すると、デバッグ例外ハンドラに入る前にこのレジスタの対応するビットを設定します。
- ^ abcd B0-B3 は、デバッグ例外が生成された時点で満たされた各ブレークポイント条件に対して設定されます。
一部の実装では、B0-B3は一致するが有効になっていないブレークポイントに設定される場合があります[1]。したがって、デバッグハンドラは、有効なブレークポイントに対応するビットのみをチェックする必要があります。
また、ハードウェアが一致しないブレークポイント条件でB0-B3をクリアするかどうかは実装に依存します。したがって、デバッグハンドラは、中断されたタスクに戻る前にこれらのビットを手動でクリアすることをお勧めします。[2]
- ^ バス ロック トラップが( MSR )のビット 2 を使用して有効になっている場合、バス ロックを引き起こす命令 (主に、プレフィックスを使用してキャッシュ ライン境界をまたぐメモリ アトミックを実行したり、キャッシュ不可能なメモリで操作したりする命令) は、DR6 のビット 11 をクリアし、トラップ タイプの #DB 例外を引き起こします。このビットは、プロセッサによって設定またはクリアされることはありません。デバッグ ハンドラは、中断されたタスクに戻る前にこのビットを 1 に設定することをお勧めします。
DEBUGCTL1D9hLOCK - ^ BD ビットは、命令ストリーム内の次の命令がデバッグ レジスタにアクセスする命令であることを示します。
実装によっては、DR7.GDが設定されていなくてもこのビットが設定される場合がある。[1]
- ^ abc DR6 のビット 13、14、および 15 はハードウェアによってクリアされることはありません。したがって、デバッグ ハンドラーは、中断されたタスクに戻る前にこれらのビットを手動でクリアすることをお勧めします。
- ^ DR6 のビット 13 はすべてのCyrixプロセッサで予約されています。
- ^ トランザクション内でデバッグ例外条件が検出されると、プロセッサはトランザクションを中止します。RTM トランザクションの高度なデバッグが有効になっている場合は、
XBEGINトランザクションを開始した命令でエラー タイプの例外としてデバッグ例外が発生します。それ以外の場合は、例外は発生せずにトランザクションが中止されます。
DR7 - デバッグ制御
デバッグ制御レジスタは、4 つのアドレス ブレークポイント条件を選択的に有効にし、4 つのブレークポイントそれぞれのタイプとサイズを指定するために使用されます。有効レベルには、ローカル (0、2、4、6) とグローバル (1、3、5、7) の 2 種類があります。ローカル有効ビットは、新しいタスクで不要なブレークポイント条件を回避するために、タスク切り替えごとにプロセッサによって自動的にリセットされます。グローバル有効ビットはタスク切り替えによってリセットされないため、すべてのタスクにグローバルな条件に使用できます。
- ^ ab 80386プロセッサでは、正確なブレークポイントを有効にすると、データアクセスを実行した命令に対してデータブレークポイント例外がトラップ型例外として発生します。正確なブレークポイントが有効になっていない場合、データブレークポイント例外は1つ以上の命令によって遅延される可能性があります。[5] 正確なブレークポイントを有効にすると、80386でパフォーマンスが大幅に低下します。[1]
それ以降のプロセッサでは、ブレークポイントは常に正確です。DR7 のビット 9:8 は書き込み可能なビットとして引き続き存在し、設定することが推奨されますが、CPU によって無視されます。
- ^ DR7 のビット 12 を 1 に設定すると、ブレークポイント、シングル ステップ、一般検出 (ビット 13 を参照)、および( / ) オペコードの動作が次のように変更されます。
F1h"ICEBP""INT01"- Intel 386/486プロセッサでは、インサーキットエミュレーションに移行します。[6] (ICEが接続されていない場合は、システムがハングアップします。)
- AMDおよびIBM 386/486プロセッサでは、システム管理モードに切り替わります。[7] [3]
- ^ デバッグ例外ハンドラに入る前に、DR6 のビット 13 が設定され、DR7 のビット 13 がクリアされ、ハンドラ内で DR0 ~ DR7 レジスタにアクセスできるようになります。
- ^ 一部の386/486プロセッサでは、DR7のビット14は分岐トレースメッセージを有効にすると報告されており[8]、ビット15はタスクトレースメッセージを有効にすると報告されています[3] 。これらのメッセージはインサーキットエミュレーションで使用することを目的としており、ICEが接続されていない場合はシステムが不安定になる可能性があります。
- ^ abcd サポートされているブレークポイント条件は次のとおりです。
CR4.DE
10bビットが欠落しているかゼロに設定されているプロセッサで ブレークポイント タイプを使用する場合の動作は未定義です。命令実行ブレークポイントの場合、ブレークポイントの長さを (1 バイト) に設定する必要があります
00b。そうでない場合、動作は未定義になります。 - ^ abcd サポートされているブレークポイントの長さは次のとおりです。
ブレークポイントの長さが 1 バイトを超える場合、指定されたブレークポイントのアドレスは、ブレークポイントの長さの最も近い倍数に切り捨てられます。
10b64 ビット モード外でブレークポイントの長さ (8 バイト) を使用する場合の動作は未定義です。 - ^ PTTT をサポートするプロセッサでは、64 ビット モード以外で DR7 に書き込むと、DR7 のビット 35:32 は変更されません。
DR4 と DR5
実際のレジスタではありません。CR4.DE ビットをサポートするプロセッサ(Intel Pentium以降) では、その動作は CR4.DE によって制御されます。
- CR4.DE=0: DR4 と DR5 はそれぞれ DR6 と DR7 のエイリアスです。
- CR4.DE=1: DR4/5 にアクセスすると #UD (無効なオペコード) 例外が発生します。
CR4.DEを持たないプロセッサでは、動作は公式には未定義です。通常、DR4/5はDR6/7にエイリアスされますが、例外が存在し、CPU検出に使用されています。[10]
参照
参考文献
- ^ abc ジョン・クロフォードとパット・ゲルシンガー、「80386 のプログラミング」、1987 年 (ISBN 0-89588-381-3)、第 8 章、635-636 ページ
- ^ Intel、ソフトウェア開発者マニュアル、注文番号 325462-078、2022 年 12 月、第 3 巻、セクション 18.2.3、ページ 3640
- ^ abcd Potemkin's Hackers Group、OPCODE.LST rev 4.51、1999年10月15日
- ^ Intel、Intel® 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル、注文番号 325462-079、2023 年 3 月、第 3 巻、3636 ページと 3643 ページの 18.2.3 章と 18.3.1.6 章
- ^ AMD、Am386 パーソナルコンピュータ用マイクロプロセッサ データブック、注文番号 11339C、1992 年 10 月 15 日、38 ページ。
- ^ Robert Collins、Intel のシステム管理モード、1997 年 1 月。1997 年 6 月 13 日時点のオリジナルよりアーカイブ。
- ^ 「Am386®SX/SXL/SXLV 高性能、低消費電力、組み込みマイクロプロセッサ」(PDF)。、出版物番号21020、改訂A、1997年4月、5ページと6ページ。
- ^ Robert Collins、DR7 の未文書化ビット。1996 年 12 月 1 日のオリジナルからアーカイブ
- ^ Intel、Intelアーキテクチャ命令セット拡張機能と将来の機能、注文番号314933-053、2024年6月、セクション16.2.3、216ページ。2024年7月28日にアーカイブ。
- ^ Geoff Chappell、「CPU Identification Before CPUID」、2023 年 3 月 4 日。2024 年 9 月 6 日にアクセス。2024 年 6 月 3 日にアーカイブ。
- Intel 80386 プログラマーズ リファレンス
外部リンク
- http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx Windows のデバッグ レジスタの使用。
