Я таился в своем учебнике по ОС, и в нем упоминалось, что преобразование виртуальных адресов может быть реализовано в точке останова по данным (для отладки программы). Я знаю только, что отладчик использует INT 3 для приостановки программы, локальных и глобальных переменных, которые каким-то образом обрабатываются в регистрах управления отладкой и адресных регистрах. Но, покопавшись, я нашел информацию только о линейном адресе при использовании регистра отладки. Никаких статей или дискуссий о механизме, лежащем в основе точки останова данных, связанных с виртуальным адресом. Так как именно это работает?
Можно ли использовать виртуальную память для поддержки функции точки останова в i386?
Ответы (1)
Линейные адреса являются виртуальными в терминологии x86. Адресация памяти x86 идет:
- режим адресации наподобие
[ebp + eax*4]
для эффективного адреса (часть смещения сегмента: off). (И каждый режим адресации подразумевает сегмент, если вы не переопределяете вручную, например,[fs: rdi]
. ОбычноDS
, если только базовый регистр не R / E / BP или R / ESP, в этом случаеSS
. Или для режимов неявной адресации как часть например,push rax
или _ 6_, это зависит от инструкции.) - seg: off - ›linear путем добавления основания сегмента к смещению.
- перевод этого линейного адреса на физический. (А в случае виртуализации - от гостевого физического к истинному физическому.)
Все шаги выполняются аппаратным обеспечением ЦП, сначала с использованием базы сегмента, а затем с использованием таблицы страниц, на которую указывает CR3. Или TLB, который кэширует переводы из этой таблицы страниц.
Регистры аппаратной отладки для аппаратных точек останова / наблюдения используют виртуальные адреса. https://en.wikipedia.org/wiki/X86_debug_register объясняет это следующим образом:
Адреса в этих регистрах являются линейными. Если пейджинг включен, линейные адреса преобразуются в физические адреса механизмом пейджинга процессора. Если пейджинг не включен, эти линейные адреса совпадают с физическими адресами.
Это означает, что точка наблюдения может сработать, когда вы обращаетесь к одному и тому же физическому адресу с другого виртуального адреса, чем тот, который вы поместили в регистр отладки. (Если это описание в Википедии является точным; я бы протестировал его и / или проверил руководства Intel или AMD, если это имеет значение.)
На самом деле я не знаю подробностей; знаю, что x86 имеет флаг TF и регистры отладки, а также общее представление о том, что они могут делать, но я никогда не писал код для их использования.
Я знаю только, что отладчик использует INT 3 для приостановки программы.
аппаратная точка останова означает, что ЦП остановится без необходимости перезаписать программный код исполняемого кода на 0xCC int3
. Регистры отладки могут делать это, а также обнаруживать доступ к определенным ячейкам памяти с помощью любой инструкции.
Таким образом, вы можете установить точку наблюдения для прерывания, когда что-либо, что ваша программа читает или записывает в определенную глобальную переменную в памяти, позволяя вам найти код, который изменяет ее с помощью указателя или чего-то еще. А поскольку он поддерживается HW, вы можете работать на полной скорости вместо того, чтобы выполнять пошаговую проверку программного обеспечения при каждом доступе.
Смотрите также
Как gdb устанавливает программные точки останова в функциях общей библиотеки? < / а>
Инструкции Intel.
alloca
или выделяет массив переменной длины после возврата из вызова функции.)
- person Peter Cordes; 15.04.2020