Здраствуйте! Если я поставлю точку остановки на дискриптор страницы памяти и при этом попробую что-то считать/записать по реальному физическому адресу (адрес IDT), который входит в данную страницу, сработает ли ловушка если я буду обращаться к память не по логическому адресу а по реальном?
Вопрос возможно в том, что сработает ли точка останова при обращении к физ. памяти, адресуемой линейным адресом, на который была поставлена точка останова по другому линейному адресу? Ответ нет
1. Я в каталоге страниц найду страницу в которой находит нужный мне адрес и на запись на эту страницу посталю точку остановки по доступу к памяти с помощью одного из отладочного регистра. 2. Потом достаю адрес IDT из регистра idtк ( в нем сохраняется линейный адрес ) и используя смещение читаю или записываю в память. Вопрос: сработает ли ловушка по доступу к данной странице памяти где находится IDT? Я возможно я не точно высказываюсь, я только начинаю открывать для себя PM, так что извините, если что-то не так.
Смысл в том что вы ставите breakpoint на запись в таблице страниц и ожидаете что при трансляции линейного адреса в физический процессор прочитает эту запись и вызовет отладочное исключение? Вы ведь будете ставить точку останова на линейный адрес, а процессор будет работать с физическим (который берется из CR3), поэтому он даже чисто теоретически не обратит внимания на вашу точку останова. А вообще, он и по логике не должен этого делать. Я никогда не задавался этим вопросом, но можете проверить например сработает ли точка останова на чтение инструкции, которую вы выполните - наверняка ведь нет, потому что инструкция это код, а не данные. А точки останова эти предназначены для данных.
Думаю если произойдёт аппаратный останов на странице с IDT(в Dr линейный адрес) возникнет #DF и процессор повиснет. Если по физическому адресу обращаться останов не произойдёт. Хотя нужно смотреть в манах как исполняет процессор обращение к IDT, если Dr7 сбрасывается до обращения, то исключение будет обработано, иначе если Dr7 сбрасывается после обращения к странице, то будет сгенерировано не обрабатываемое исключение двойной ошибки.
Clerk как-то мудрено шибко. Кем он и куда сбрасывается? Вообще, кто занимался на практике, есть какие-нибудь сведения что процессор сгенерирует int1 для точки останова по чтению данных, кроме как в том случае если когда происходит считывание операнда команды? Что-то сумлеваюсь
SashaTalakin Ну он должен сбрасываться если два раза #DB сгенерируется.. хотя хз, в любом случае процессор зависнет, либо войдя в #DF, либо крутиться будет исполняя останов, что врятле. Сам то хоть понял что сказал ??
Я что будет если IDT поместить на страницу которая находится в файле подкачки? В idtr уже не будет содержаться физический адрес IDT, поскольку IDT будет поза межой доступной физической памяти.
qman Если процессор не может извлечь дескриптор, или тп., он останавливается. Без разницы, испортить TSS, IDT похерить..
Ну у любой нормальной команды есть операнды, может быть они неявно адресованы, но подразумеваются. Вопрос в том, может ли быть сгенерирована точка останова на чтение/запись памяти в каком-то ином случае, кроме как в случае с доступом к операнду команды. Тобиж например при извлечении инструкции из памяти происходит чтение по cs:ip. Будет ли например в этом случае сигнализация точки останова, установленой на этот линейный адрес? Мне кажется что врядли. Интересно а что будет если в пользовательской программе через seh например поставить точку останова исполнения на первую или вторую инструкцию обработчика int1 и на инструкцию в собственном коде (чтобы передать управление на иnt1).
В цикле вызов диспетчера исключений, затем переполнение стека. Далее регистр Esp адресует страницу не доступную для записи, ядро копирует стековый фрейм туда, возникает исключение, его ловит сех-фрейм и ядро тихо завершает процесс, это всё происходит в KiDispatchException().
Не будет работать ваша точка останова на страницу вообще. См. пост #5. Устанавливая bp на чтение в таблице страниц, вы пользуетесь неявно все тем же механизмом страничной адрессации. Процессор же, работая с этой записью, этот механизм осуществляет. Пользуется при этом он физической адрессацией
Только в цикле не вызов диспетчера будет видимо, а вызов int1. А диспечер исключений подключится уже в момент переполнения
Clerk, э. еще разок вот это читаем: Где здесь передача исключения в юзермод? Ну кроме установки dr-ов. И да, извиниться не забываем за кашу в голове