Линейные адреса являются виртуальными, в терминологии x86. Адресация памяти x86 идет:
- режим адресации, такой как
[ebp + eax*4]
, в "эффективный адрес" ( часть смещения seg: off). - seg: off -> linear путем добавления базы сегмента к смещению.
- перевод этого линейного адреса в физический. (И при виртуализации от гостевого физического до истинного физического.)
Все шаги выполняются аппаратным обеспечением ЦП, сначала с использованием базы сегментов, затем с использованием таблицы страниц, на которую указывает CR3. Или TLB, который кэширует трансляции из этой таблицы страниц.
Регистры аппаратной отладки для аппаратных точек останова / наблюдения используют виртуальные адреса. https://en.wikipedia.org/wiki/X86_debug_register объясняет это следующим образом:
Адреса в этих регистрах являются линейными адресами. Если пейджинг включен, линейные адреса преобразуются в физические адреса с помощью механизма пейджинга процессора. Если пейджинг не включен, эти линейные адреса совпадают с физическими адресами.
Это означает, что точка наблюдения может сработать при доступе к одному и тому же физическому адресу с другого виртуального адреса чем тот, который вы положили в регистр отладки. (Если это описание в Википедии точное; я бы проверил его и / или проверил бы руководства Intel или AMD, если это имеет значение.)
На самом деле я не знаю деталей; Я знаю, что x86 имеет флаг TF и регистры отладки, а также общее представление о том, что они могут делать, но я никогда не писал код для их использования.
Я знаю только то, что отладчик использует INT 3 для приостановки программы
«аппаратная точка останова» означает, что ЦП остановит без программного обеспечения , которое должно переписать исполняемый код в 0xCC int3
. Регистры отладки могут делать это, а также обнаруживать доступ к определенным ячейкам памяти с помощью любой инструкции.
Таким образом, вы можете установить точку наблюдения, которая будет прерываться, когда все, что ваша программа читает или записывает определенную глобальную переменную в памяти, позволяя вам найти код, который изменяет его с помощью указателя или чего-то еще. А так как он поддерживает HW, вы можете работать на полной скорости, вместо того, чтобы выполнять одношаговую проверку программного обеспечения при каждом доступе.
См. Также