Как мне записать регистры отладки x86 из пространства пользователя на OSX? - PullRequest
2 голосов
/ 09 апреля 2010

Я бы хотел поиграть с отладочными MSR, определенными в спецификации x86 (DR0-7) из моей программы OSX. К сожалению, для этого требуется CPL == 0 (он же кольцо 0). Я пролистал системные вызовы OSX и, за исключением kernel_debug, на самом деле ничего не выпрыгивает как способ доступа к ним.

Возможно, они доступны только через некоторый интерфейс более высокого уровня, например kernel_debug, но мне неясно, так ли это, или я просто не нашел магический вызов, чтобы добраться до них.

Моя конечная цель - получить доступ к функциональности этих регистров, а не к самим регистрам. Кто-нибудь знает, как сделать такие вещи, как установить аппаратные точки останова?

Ответы [ 2 ]

3 голосов
/ 09 апреля 2010

Оказывается 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 голосов
/ 09 апреля 2010

Это в значительной степени смысл инструкций кольца 0. Они недоступны из пространства пользователя .

...