如何从OSX上的用户空间编写x86调试寄存器?

时间:2010-04-09 00:50:29

标签: macos debugging kernel system-calls msr

我想在我的OSX用户空间程序中使用x86规范(DR0-7)中定义的调试MSR。不幸的是,这些要求CPL == 0(aka ring 0)。我已经翻阅了OSX系统调用,除kernel_debug外,没有什么能真正跳出来作为访问这些系统的方法。

可能是这样的情况,它们只能通过某些更高级别的界面(如kernel_debug)获得,但我不清楚是否是这种情况,或者我还没有找到魔术调用来获取它们。

我的最终目标是访问这些寄存器的功能,而不是寄存器本身。有没有人知道如何设置硬件断点?

2 个答案:

答案 0 :(得分:3)

结果是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);

答案 1 :(得分:-1)

这几乎是响铃0指令的重点。 无法从用户空间访问它们