x86-64 и дальние звонки / прыжки
-
02-10-2019 - |
Вопрос
Краткое резюме: в режиме X86-64 на дальше прыжках, как медленные, как в режиме x86-32?
На процессоре X86 прыжки падают на три типа:
- Короткие, с зачетом ПК +/- 127 байтов (2-х байтовая инструкция)
- Рядом, с компенсацией +/- 32K, что «бросается вокруг» текущего сегмента (3-х байтовая инструкция)
- Далеко, который может прыгать где угодно (5 байтовых инструкций)
Короткие и близкие прыжки принимают 1-2 тактовые циклы, в то время как дальние прыжки принимают 50-80 часов, в зависимости от процессора. Из моего чтения документации это потому, что они «выходят за пределы CS, текущий сегмент кода».
В режиме X86-64 сегменты кода не используются - сегмент эффектно всегда 0..infinity. Эрго, не должно быть наказание за выезд за пределы сегмента.
Таким образом, вопрос: изменяется ли количество тактовых циклов для дальнего прыжка, если процессор находится в режиме X86-64?
Соответствующие бонусные вопросы: большинство * NIX-подобных операционных системах, работающих в 32-битной защищенном режиме, явно устанавливают размеры сегмента до 0, ... Infinity и управлять линейным -> физическим переводом полностью через таблицы страниц. Получают ли они извлечения из этого с точки зрения времени для дальних вызовов (меньше тактных циклов), или является штрафом, действительно внутреннее наследие процессора из реестров сегментов размеров было с 8086?
Решение
CS используется не только для базы и ограничения, но и для разрешений. CPL кодируется там, а также другие поля, такие как:
- D-бит - 32-битный или 16-битный размер сегмента по умолчанию
- L-бит - выбирает совместимость или 64-битный режим для сегмента (и в этом случае основание и предел значительны)
Дальнее прыжков также может пройти через ворота задач, а дальние звонки также могут пройти через Call Gates. Все они должны быть обработаны, независимо от 64-битного режима.
Подводя итог, прыжок дальнего прыжка в 64-битном режиме не быстрее, чем в 32-битном режиме. На самом деле, учитывая, что когда 64-битный режим включен, дескрипторы сегментов в два раза больше, чем когда 64-битный режим отключен, все доступности таблицы дескриптора удваиваются, что может удлинить время прыжка.