если я установлю точки останова для определенных операций регистра сборки, может ли это потенциально блокировать другие потоки/процессы?

# #assembly #x86-64 #breakpoints #cpu-registers

#собрание #x86-64 #точки останова #процессорные регистры

Вопрос:

Привет, насколько я понимаю, регистры сборки (rax, rdx и т. Д. Для 64-битной архитектуры)

сопоставляются с регистрами ЦП при вызове, так как в современных процессорах больше регистров, чем в регистре сборки.

мне было интересно, когда я устанавливаю точки останова для некоторых операций сборки для целей отладки.. например, что-то вроде

 mov rax, rdx   

действительно ли это «блокирует» соответствующий регистр в процессоре и, следовательно, потенциально может замедлить или даже заблокировать другие процессы/потоки?

я относительно новичок в сборке и просто пытаюсь понять идею о том, как логические регистры из сборки преобразуются в физические регистры из центрального процессора

Комментарии:

1. Нет, регистры являются закрытыми для каждого логического ядра, и это не то, как точки останова. (Точки останова просто перехватывают обработчик исключений, даже не приступая к выполнению инструкции. Встроенные системы с внешней отладкой JTAG могут работать, приостанавливая работу всего процессора / микроконтроллера, а не выполняя на нем другие программные инструкции. Но GDB под операционной системой-это не так.)

2. я понимаю, спасибо тебе

Ответ №1:

Ничего подобного не происходит.

При достижении точки останова происходит то же самое, что происходит при каждом переключении контекста: Процесс прерывается. Операционная система берет на себя управление и сохраняет содержимое всех регистров в памяти. Затем он передает управление другому процессу (в данном случае, скорее всего, отладчику), восстанавливая регистр до значений, сохраненных для этого процесса.

Хотя программисту виден только один набор регистров, операционная система меняет их местами таким образом, чтобы каждый процесс мог претендовать на доступ ко всем регистрам. То же самое относится и к памяти; это называется виртуальной памятью.

Комментарии:

1. я вижу, большое вам спасибо за разъяснение

2. @quanqingye Если это ответ на ваш вопрос, обязательно отметьте ответ как принятый, нажав на галочку рядом с ним.

Ответ №2:

Точки останова достигаются двумя механизмами в архитектурах x64. Устаревший метод заключается в замене первого байта инструкции, например, mov rax, rdx инструкцией точки останова 0xcc или int 3h .

Это приведет к тому, что выполнение перейдет в обработчик отладки, который обычно должен заменить 0xcc инструкцию исходным байтом, чтобы фактически выполнить эту инструкцию.

Другой механизм заключается в использовании отладочных регистров (от DB0 до DB3) для размещения адресов, что приведет к блокировке процессора при чтении памяти, записи в память, выполнении или вводе-выводе по этому адресу.

Регистры отладки настраиваются для каждого потока, в то время как изменение кода для получения мягких точек останова влияет на все потоки. (Таким образом, они тоже достигнут точки останова, если попытаются на самом деле выполнить ту же инструкцию. Но в остальном все равно никакого эффекта.)

Комментарии:

1. Да, отладочные регистры, такие как DB0, относятся к логическому ядру так же, как и правила управления, такие как таблица страниц CR3. И да, операционные системы обрабатывают их при переключении контекста, поэтому программное обеспечение видит их как отдельные потоки.