eXeL@B —› Программирование —› EFLAGS, защищённый режим и брейкпоинты. |
Посл.ответ | Сообщение |
|
Создано: 19 февраля 2010 22:21 · Личное сообщение · #1 Всем злого времени суток - доброго желать надоело. Читал тут на днях мануалы от Интела и заинтересовался разделом по EFLAGS, в частности, есть там такой бит под номером 16 (bit 16) Resume. Так вот талмуды гласят, что будучи установленным, он временно отключает генерацию иксепшенов типа #DB, т.е., как я понял, лепка опкодов CC больше не даст бряков. Я через pushfd считал его значение, в нём через or взвёл этот чудесный бит, и через popfd затолкал всё с изменениями в этот регистр. Но ничего не поменялось - иксепшены как были, так и остались, а бит в этом регистре снова сбросился назад. Почему? ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 19 февраля 2010 22:45 · Личное сообщение · #2 |
|
Создано: 19 февраля 2010 22:55 · Личное сообщение · #3 n0name Почитал ещё раз. Ну, написано, что отладочный софт должен править образ EFLAGS непосредственно перед возвратом в прерванную прогу перед IRETD, причём править значение в стэке. Но должен - растяжимое понятие, там же не написано, почему не работает так, как я делаю. И вообще, развёрнутые ответы со ссылками приветствуются. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 19 февраля 2010 23:06 · Поправил: Модератор · Личное сообщение · #4 |
|
Создано: 19 февраля 2010 23:13 · Личное сообщение · #5 Archer Теперь ясно. Правда, не ясно, что бы мне дало ещё трёхразовое чтение. ИМХО, трёхразовое чтение, в отличие от трёхразового питания, пользы не приносит. Короче, на антидебаг этот бит не тянет. Тему пока не закрываю - может, кто-то ещё захочет высказаться. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 19 февраля 2010 23:19 · Поправил: DenCoder · Личное сообщение · #6 PUSHFD, POFD не изменяют флаг RF, взводится после(!) команды IRETD на некоторое время, чтобы та же самая команда не вызвала исключение #DB. А для инструкции INT 3 с кодом 0xCC есть исключение #BP. Его вызов этот флаг не отключает. Вот Debug-регистры не отключит. Кроме всего этого есть еще какой-то случай, когда этот флаг устанавливается. У меня вот такие дела #UD {#GP(0)} много раз до переполнения стека, и всегда этот флаг взведен ----- IZ.RU |
|
Создано: 19 февраля 2010 23:22 · Личное сообщение · #7 ARCHANGEL 18.3.1.1 > Note that the POPF, POPFD, and IRET instructions do not transfer the RF image into the EFLAGS register. Юзайте прерывания для этих целей. Например последовательность Int 0x2A не будет генерировать трассировачный останов. Кстате 0xCC генерит #BP, а не #DB - оно и понятно, камень инструкцию пропустить не может. |
|
Создано: 19 февраля 2010 23:28 · Поправил: DenCoder · Личное сообщение · #8 Это вы какой мануал читаете? Не ----- IZ.RU |
|
Создано: 19 февраля 2010 23:44 · Личное сообщение · #9 |
|
Создано: 20 февраля 2010 00:16 · Поправил: DenCoder · Личное сообщение · #10 Дополняю и исправляю свои слова. Исследования креш-дампов наводят на мысль, что вообще при любых исключениях, или, может быть, почти при любых, RF взводится, чтобы запретить #DB, которое "...вызывается (1)как ловушка при пошаговой трассировке (флаг TF = 1), (2)при переключении на задачу с установленным TF и (3)при срабатывании точки останова во время доступа к данным, определенной в отладочных регистрах. " Archer прав на все 100. ----- IZ.RU |
|
Создано: 20 февраля 2010 02:32 · Личное сообщение · #11 RF подавляет только #DB на адрес инструкции, больше никак. Хотя можно было бы ожидать, что она могла бы подавлять и #DB при dr7.gd=1 и следующей инструкции, пишущей/читающей отл.регистры. Однако это не так, в этом случае почему то и mov ss,... не подавляет, детект чтения записи отл.регистров подчиняется другой логике |
|
Создано: 20 февраля 2010 02:40 · Личное сообщение · #12 DenCoder пишет: Исследования креш-дампов наводят на мысль, что вообще при любых исключениях, или, может быть, почти при любых, RF взводится, чтобы запретить #DB, которое "...вызывается (1)как ловушка при пошаговой трассировке (флаг TF = 1), (2)при переключении на задачу с установленным TF и (3)при срабатывании точки останова во время доступа к данным, определенной в отладочных регистрах. " Archer прав на все 100. , Наоборот, RF сбрасывается во всех случаях, в т.ч . и при sysenter. ЗЫ Про задачу с установленным TSS.T - порадовал, в каком софте ты это видел!? Всегда считал, что это ненужная/неиспользуемая фишка интела |
|
Создано: 20 февраля 2010 03:13 · Поправил: DenCoder · Личное сообщение · #13 spinz, Зубков так пишет. Проверить это на практике стоит некоторых трудов. По-моему это полезно... для отладчиков на другой оси... Зубков ничего не писал, что RF сбрасывается или устанавливается при возникновении некоторых исключений. Опровержения или подтверждения этому пока не нашел. С другой стороны, как объяснить то, что у меня в стеке всегда RF взведен от начала возникновения #UD? ЗЫ. Вот бы мне помог в моем дневнике... ----- IZ.RU |
|
Создано: 20 февраля 2010 04:35 · Поправил: spinz · Личное сообщение · #14 |
|
Создано: 20 февраля 2010 13:54 · Личное сообщение · #15 |
eXeL@B —› Программирование —› EFLAGS, защищённый режим и брейкпоинты. |
Эта тема закрыта. Ответы больше не принимаются. |