2

OSX ユーザー空間プログラムから、x86 仕様 (DR0-7) で定義されているデバッグ MSR を試してみたいと思います。残念ながら、これらには CPL == 0 (別名リング 0) が必要です。私は OSX syscalls を試してみましたが、kernel_debugこれらにアクセスする方法として実際に飛び出すものは何もありません。

のような高レベルのインターフェースを介してのみ利用できる場合もありますが、それが事実なkernel_debugのか、それともそれらにアクセスするための魔法の呼び出しが見つからなかっただけなのかは不明です。

私の最終的な目標は、レジスタ自体ではなく、これらのレジスタの機能にアクセスすることです。ハードウェアブレークポイントの設定などの方法について洞察を持っている人はいますか?

4

2 に答える 2

4

thread_get_state/がthread_set_state答えです。

#include <mach/mach_types.h>

thread_t target = get_target_thread();
struct x86_debug_state dr;
mach_msg_type_number_t dr_count = x86_DEBUG_STATE_COUNT;

kern_return_t rc = thread_get_state(target, x86_DEBUG_STATE, &dr, &dr_count);    
printf("DR0: 0x%08x\n", dr.uds.ds32.__dr0);
printf("DR1: 0x%08x\n", dr.uds.ds32.__dr1);
printf("DR2: 0x%08x\n", dr.uds.ds32.__dr2);
printf("DR3: 0x%08x\n", dr.uds.ds32.__dr3);
printf("DR4: 0x%08x\n", dr.uds.ds32.__dr4);
printf("DR5: 0x%08x\n", dr.uds.ds32.__dr5);
printf("DR6: 0x%08x\n", dr.uds.ds32.__dr6);
printf("DR7: 0x%08x\n", dr.uds.ds32.__dr7);
于 2010-04-09T04:09:06.673 に答える
-1

これがリング 0 命令の要点です。ユーザー空間からはアクセスできません

于 2010-04-09T00:53:23.883 に答える