Как регистры сегментов не используются в адресации памяти защищенного режима в современных системах x86?

Я понимаю, как работает сегментация, и что подкачка является предпочтительным способом доступа к памяти в современных операционных системах. Но я не уверен, что регистры сегментов не используются:

  1. Они просто кажутся неиспользованными, потому что они обычно имеют базу 0 и предел 0xFFFFFFFF. Обратите внимание, что в этом случае они все еще участвуют в вычислении физического адреса, но являются прозрачными и предоставляют модель плоской памяти.
  2. Они нетронуты вообще.

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-битный код), и, возможно , именно это имело значение.

Другие вопросы по тегам