【问题标题】:How do I write x86 Debug registers from user space on OSX?如何从 OSX 的用户空间写入 x86 调试寄存器?
【发布时间】:2011-02-05 23:04:07
【问题描述】:

我想在我的 OSX 用户空间程序中使用 x86 规范 (DR0-7) 中定义的调试 MSR。不幸的是,这些需要 CPL == 0(又名环 0)。我已经浏览了 OSX 系统调用,除了 kernel_debug 之外,没有任何东西可以作为访问这些调用的方式。

可能只有通过kernel_debug 等更高级别的接口才能使用它们,但我不清楚是否是这种情况,或者我只是没有找到获取它们的神奇调用。

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

【问题讨论】:

    标签: macos debugging kernel system-calls msr


    【解决方案1】:

    原来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);
    

    【讨论】:

      【解决方案2】:

      这就是 ring 0 指令的重点。 它们不能从用户空间访问

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-31
        • 2018-01-31
        • 2021-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        相关资源
        最近更新 更多