Инструкция по сборке CALL, пишешь неисправности? - PullRequest
1 голос
/ 24 июня 2011

В обработчике ошибок страницы ядра linux с использованием некоторой разборки кода операции я вижу, что в архитектуре x86 инструкция CALL или 0xE8 иногда выдает ошибку записи, а ESI и EDI оба равны NULL.Мне было интересно, есть ли конкретная причина для этого, поскольку CALL берет адрес памяти и просто меняет EIP на это значение, и для этого не требуется страница, поскольку это просто EIP +lative_offset.Если бы кто-нибудь мог это прояснить, это было бы очень признательно.

1 Ответ

8 голосов
/ 24 июня 2011

Инструкция call не просто меняет eip - она ​​также должна записать текущий eip (обновленный, чтобы указывать на следующую инструкцию) в стек до этого изменения.Инструкция типа jmp будет действовать так, как вы предлагаете, но call немного отличается тем, что вы должны иметь возможность ret к текущему местоположению позже.

Я не могу быть уверен, так какВы не дали нам код, полное содержимое регистра и таблицы страниц (что будет большим объемом информации для вопроса), но мне кажется, что наиболее вероятным объяснением является то, что стек в настоящее время переключаетсяи должен быть выкуплен обратно.

Другая возможность, о которой я изначально думал, это то, что адрес, по которому вы переходили, был нерезидентным, но я не думаю, что это вызвало бы ошибку в callсам по себе.

Это будет вызывать ошибку очень быстро после этого, поскольку процессор попытался получить следующую инструкцию, но я не думаю, что это то, что указано в вашем описании, поскольку:

  • вы заявляете, что это происходит на call
  • , который будет ошибкой чтения, а не записью.

Значения esi и edi не являются проблемой - они не принимают участия в call.

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