2010-04-09 50 views
2

我想在我的OSX用戶空間程序中使用x86規範(DR0-7)中定義的調試MSR。不幸的是,這些需要CPL == 0(又名0環)。我已經瀏覽了OSX系統調用,除了kernel_debug之外,沒有什麼可以作爲訪問這些調用的方式。如何在OSX上的用戶空間編寫x86 Debug寄存器?

可能是這種情況,他們只能通過像kernel_debug這樣的更高級別的界面來使用,但是我不清楚這是否是這種情況,或者我是否還沒有找到魔法調用來找到它們。

我的最終目標是訪問這些寄存器的功能,而不是寄存器本身。有沒有人對如何設置硬件斷點等事情有所瞭解?

回答

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); 
0

這幾乎是0指令的要點。 他們不能從用戶空間訪問。