我想在我的OSX用户空间程序中使用x86规范(DR0-7)中定义的调试MSR。不幸的是,这些要求CPL == 0(aka ring 0)。我已经翻阅了OSX系统调用,除kernel_debug
外,没有什么能真正跳出来作为访问这些系统的方法。
可能是这样的情况,它们只能通过某些更高级别的界面(如kernel_debug
)获得,但我不清楚是否是这种情况,或者我还没有找到魔术调用来获取它们。
我的最终目标是访问这些寄存器的功能,而不是寄存器本身。有没有人知道如何设置硬件断点?
答案 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指令的重点。 无法从用户空间访问它们。