Ошибка сегментации в "mov% eax,% db0" - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь создать аппаратную точку наблюдения динамически, и для этого в своей программе я устанавливаю регистры отладки.Я использую только dr0 и выбрал длину 3 (4 байта выровнены) и введите 1 (перерыв при записи).Мой процессор - Intel x86_it.Однако при каждом запуске я вижу segfault всякий раз, когда пытаюсь записать в db0 / dr0.Нарушающая функция и ее сборка из gdb показаны ниже.

int watchpoint(void* addr)
{
    unsigned long value = (unsigned long) addr;
    asm("mov %0, %%dr0"     ::"r" (0));
    asm("mov %0, %%dr7"     ::"r" (0));
    asm("mov %0, %%dr0"     ::"r" (value));
    asm("mov %0, %%dr7"     ::"r" (851969));
    return 0;
}



   0x0832aa38 <+0>:     push   %ebp
   0x0832aa39 <+1>:     mov    %esp,%ebp
   0x0832aa3b <+3>:     sub    $0x10,%esp
   0x0832aa3e <+6>:     mov    0x8(%ebp),%eax
   0x0832aa41 <+9>:     mov    %eax,-0x4(%ebp)
   0x0832aa44 <+12>:    mov    $0x0,%eax
=> 0x0832aa49 <+17>:    mov    %eax,%db0  >>>>> Crashes here.
   0x0832aa4c <+20>:    mov    $0x0,%eax
   0x0832aa51 <+25>:    mov    %eax,%db7
   0x0832aa54 <+28>:    mov    -0x4(%ebp),%eax
   0x0832aa57 <+31>:    mov    %eax,%db0
   0x0832aa5a <+34>:    mov    $0xd0001,%eax
   0x0832aa5f <+39>:    mov    %eax,%db7
   0x0832aa62 <+42>:    mov    $0x0,%eax
   0x0832aa67 <+47>:    leave
   0x0832aa68 <+48>:    ret

Я неправильно пишу регистр?Может кто-нибудь помочь, пожалуйста?

Спасибо.

1 Ответ

0 голосов
/ 24 октября 2018

http://felixcloutier.com/x86/MOV-2.html (mov для отладки регистра) говорит:

#GP(0) Если текущий уровень привилегий не равен 0.

Пользователь-пространственный код выполняется в кольце 3 (уровень привилегий 3).root привилегия - это просто программная вещь;он все еще находится в чистом состоянии 3.

Системный вызов Linux iopl может повысить уровень привилегий аппаратного ввода-вывода x86, но это влияет только на несколько инструкций, таких как in / out и cli /sti.MOV для отладки регистров не является одним из них.


В Linux вы можете либо написать свой собственный модуль ядра, либо использовать системный вызов ptrace для установки точек останова.

В других ОС вы найдете другие API, которые могут использовать отладчики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...