Канонический адрес
Во время чтения учебника Intel я обнаружил следующее:
* На процессорах, поддерживающих архитектуру Intel 64, поле IA32_SYSENTER_ESP и поле IA32_SYSENTER_EIP должны содержать канонический адрес.
И я не понимаю, что они подразумевают под "каноническим адресом"..?
Хотел бы получить объяснение;) не мог найти что-нибудь @ google
Спасибо
1 ответ
Я предлагаю вам скачать полное руководство разработчика программного обеспечения. Документация доступна в отдельных томах, но эта ссылка дает вам все семь томов в одном массивном PDF, что облегчает поиск вещей.
Ответ находится в разделе 3.3.7.1. Первая строка этого раздела гласит
В 64-битном режиме адрес считается в канонической форме, если биты адреса от 63 до наиболее значимого реализованного бита микроархитектурой установлены на все единицы или все нули.
Это продолжается оттуда...
Этот ответ менее подробен, чем предыдущие, но ИМХО легче понять:
Хотя 64-битные процессоры имеют регистры шириной 64 бита, в системах обычно не реализуются все 64-битные адресации (16 эксабайт теоретической физической памяти).
Таким образом, большинство архитектур определяют нереализованную область адресного пространства, которую процессор сочтет недопустимой для использования. x86-64 (...) определяют наиболее значимый действительный бит адреса, который затем должен быть расширен знаком (...) для создания действительного адреса. В результате все адресное пространство эффективно делится на две части, верхнюю и нижнюю, а адреса между ними считаются недействительными. (...) Действительные адреса называются каноническими адресами (недопустимые адреса не являются каноническими).
С https://www.bottomupcs.com/virtual_memory_is.xhtml
Sign-extended
- это тот же самый бит, самый старший бит, скопированный в адрес старших битов. Верхний11111...
ниже 00000...
.
Как и user3386109, указанный раздел 3.3.7.1 покрывает это 5 (трудно переварить) абзацами, для меня это страница 74 из 4 комплектов томов, которые вы можете загрузить с сайта Intel или перейти прямо здесь: https://software.intel.com/ сайты / по умолчанию / файлов / управления / 39 / c5 / 325462-SDM-Vol-1-2abcd-3abcd.pdf
Эти параграфы говорят о том, что канонический адрес - это что-то меньшее, чем полный 64-битный адрес. Существуют разные реализации адресации, такие как 48-битная или 56-битная.
48-битная реализация будет иметь высокий полуканонический адрес, начиная с
0xFFFF800000000000
в то время как нижняя половина будет
0x00007FFFFFFFFFFF
Как сказано в руководстве, бит 63 к любому значению будет означать его как канонический адрес, если вы видите все единицы или все нули. В 56-битной реализации я сразу знаю, что смотрю канонический адрес, когда вижу 0xFF____ или 0x00____.
Может быть, полезный способ запомнить это само слово canonical означает относящееся к общему правилу или способу сделать что-то. Я просто думаю, что Intel раньше обращалась с использованием менее 64 бит, так что... это имеет смысл. Также, если что-то соответствует канону, как в "Звездном пути" или в комиксах, это то, как вещи были видны или сделаны изначально.
Теперь, чтобы ответить, ПОЧЕМУ у нас есть канонические адреса? Никому не нужно обращаться к 16 экзабайтам (теоретический предел для 64-битной машины), поэтому во втором абзаце этого руководства просто говорится, что архитектура Intel "определяет" 64-битный линейный адрес, но похоже, что никто не будет его использовать. Теперь, на всякий случай, в третьем параграфе говорится, что реализация все еще будет проверять эти первые несколько битов и, если НЕ в канонической форме, генерировать исключение "общей защиты".