3

私は現在 Linux ARM カーネルをデバッグしていますが、CPU モード (usr、svc、abt など) が変更されたときに gdb が壊れる可能性があるかどうか常に疑問に思っていました。現在、どのモードにいるのかわからない場合、通常は psr レジスタを複数回確認する必要がありますが、モード変更でブレークするなど、より効果的な方法があるのではないでしょうか?

例外ベクトルにブレークポイントを設定できることはわかっていますが、それは特権モードへのモード変更のみを検出し、その逆は検出しないことを意味します。psr が 0x10(usr モード) に変わるかどうかを確認するコマンドがあるのではないでしょうか?

ありがとう

4

1 に答える 1

0

すべてのプロセスはentry-common.Sでスケジュールされます。このファイルには、という名前のマクロがありarch_ret_to_userます。それを命令として定義します。BKPTおそらく、グローバル セットを介した条件付き/procです。

スーパーバイザー コードは何でも変更できるため、CPU のみを使用して一般的にユーザー モードへの切り替えを検出することはできません (サポート コードが必要です) 。CPUに機能がある場合、 ETMには何らかの手段があるかもしれません。

ユーザータスクが再スケジュールされたときのコールバックを持つthread_nofity.hもあります。デバッガーが必要ない場合、または条件が意図されている場合にのみ通知機能から呼び出す関数にブレークポイントを配置する場合は、独自のロジックでこれをフックできます。null(){}

于 2013-03-02T21:47:49.187 に答える