2015-05-01 1 views
3

Что произойдет, если невысокая загрузка переполнит самый верхний адрес на x86? Например, что произойдет при загрузке 4-байтового целого по адресу 0xfffffffe на 32-разрядном процессоре x86? Конечно, самая верхняя страница (0xfffff000 - 0xffffffff) отображается в какую-либо физическую память, а страница читается/записывается, а текущая программа загрузки находится в ядре операционной системы в Ring0. Вы можете предположить, что загрузка 4-байта на 0xfffffffc является законной для простоты.верхний адрес переполнения нагрузки на x86

Будет ли такая загрузка генерировать ошибку страницы?

ответ

3

Он будет генерировать ошибку общей защиты (#GP) из-за проверки предела в сегментах. Процессор проверяет предел сегмента при доступе к данным с регистром сегмента DS, который является обычным делом. Предел сегмента по умолчанию для сегмента сегмента DS: [0,0xffffffff].

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

  • A байт со смещением больше, чем эффективный предел
  • Одним словом на смещение больше, чем (эффективного предельного срока - 1)
  • двойного слова на смещение больше, чем (эффективного предельного срока - 3)
  • квадраслово при смещении больше, чем (эффективного предельного срока - 7)

В соответствии со спецификацией Intel x86 «явно неравномерные» обращения (независимо от того, находятся ли они на краю вашего адресного пространства) также могут вызвать общие ошибки защиты для команд AVX, FME, VEX или SSE.

Интересно, что самые низкие и самые высокие адреса - это не единственные границы вашего адресного пространства, где это может произойти. Больше границ отображается в адресных пространствах x86_64, где в середине есть sparse/unaddressable space, который ваш процессор не может использовать (так как производители процессоров могут сократить количество бит, необходимых для многих внутренних процессоров - ведь никто не использует полное 64-разрядное адресное пространство).

+0

Спасибо за ваш ответ! Прошу прощения за то, что вы изменили свой ответ. Я считаю, что причиной генерации ошибки #GP является предел сегмента. Можем ли мы добавить причину в ответ? – writalnaie

+0

Нет проблем, я не понял, почему изменение было отклонено! Я обновил ответ с вашими изменениями. – Dan

+0

@writalnaie: не забудьте принять, если это ответили на ваш вопрос :) – Dan