Как регистры сегментов не используются в адресации памяти защищенного режима в современных системах x86?
Я понимаю, как работает сегментация, и что подкачка является предпочтительным способом доступа к памяти в современных операционных системах. Но я не уверен, что регистры сегментов не используются:
- Они просто кажутся неиспользованными, потому что они обычно имеют базу 0 и предел 0xFFFFFFFF. Обратите внимание, что в этом случае они все еще участвуют в вычислении физического адреса, но являются прозрачными и предоставляют модель плоской памяти.
- Они нетронуты вообще.
1 ответ
Возможно, это забавная комбинация. Что происходит с точки зрения высокого уровня (если это можно назвать высоким), так это то, что большинство сегментов сконфигурированы с основанием 0 и пределом 0xFFFFFFFF (fs
а также gs
может быть использован для специальных целей, хотя).
Но настройка сегмента с ненулевой базой может иметь последствия для производительности. Например, в AMD K8 и K10 настройка сегмента кода на ненулевое основание увеличивает задержку ошибочных предсказаний ветвления на два цикла, а общий адрес стоит больше времени для вычисления, если задействован сегмент с ненулевым основанием, Это может означать, что процессор имеет специальный быстрый путь для сегментов с нулевой базой, так что база вообще не участвует в вычислении адреса, а не добавляет ноль (что все равно займет время).
Я не мог найти ссылку на этот эффект, существующий на любых других µархах, но он может быть не полностью изучен, потому что это относительно редкий эффект, особенно в чувствительном к производительности коде. В быстром тесте похожий эффект, похоже, существует в Haswell с этим кодом (пропускает некоторые тривиальные настройки):
.loop:
mov rax, [rsp+rax]
add ecx, 1
jnz .loop
Выполнение двух циклов за итерацию быстрее (5 циклов / итерация), чем этот код (7 циклов / итерация):
.loop:
mov rax, [gs:rax]
add ecx, 1
jnz .loop
Возможно, это означает, что также будет задействовано больше микропроцессоров Intel, хотя, возможно, это неточно, поскольку ни один сегмент вообще не участвует в первом коде (так как это 64-битный код), и, возможно , именно это имело значение.