Можно ли использовать виртуальную память для поддержки функции точки останова данных в i386? - PullRequest
1 голос
/ 15 апреля 2020

Я скрывался в своем учебнике по ОС, и в нем упоминалось, что виртуальная трансляция адресов может быть реализована в точке останова данных (для отладки программы). Я только знаю, что отладчик использует INT 3 для приостановки программы, локальные и глобальные переменные обрабатываются тем или иным образом в регистрах управления отладкой и адресов. Но после некоторого копания я нашел информацию о линейном адресе только при использовании регистра отладки. Никаких статей или дискуссий о механизме, лежащем в основе точки прерывания, связанной с виртуальными адресами Так как именно это работает?

1 Ответ

4 голосов
/ 15 апреля 2020

Линейные адреса являются виртуальными, в терминологии 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, вы можете работать на полной скорости, вместо того, чтобы выполнять одношаговую проверку программного обеспечения при каждом доступе.

См. Также

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