Краткий обзор: в режиме x86-64 медленные переходы такие же медленные, как в режиме x86-32?
На процессоре x86 переходы делятся на три типа:
- короткий, со смещением ПК +/- 127 байт (2-байтовая инструкция)
- рядом, со смещением +/- 32k, которое «катится» вокруг текущего сегмента (3-байтовая инструкция)
- дальний, который может прыгнуть куда угодно (5-байтовая инструкция)
короткие и ближние скачки занимают 1-2 такта, в то время как дальние скачки занимают 50-80 тактов, в зависимости от процессора. Из моего прочтения документации это происходит потому, что они «выходят за пределы CS, текущего сегмента кода».
В режиме x86-64 сегменты кода не используются. Сегмент фактически всегда равен 0 ... бесконечности. Поэтому не должно быть наказания за выход за пределы сегмента.
Таким образом, вопрос: меняется ли количество тактов для дальнего перехода, если процессор находится в режиме x86-64?
Связанный бонусный вопрос: Большинство * nix-подобных операционных систем, работающих в 32-битном защищенном режиме, явно устанавливают размеры сегментов равными 0..infinity и полностью управляют линейным -> физическим переводом через таблицы страниц. Получают ли они выгоду от этого с точки зрения времени для удаленных вызовов (меньше тактовых циклов), или же это на самом деле наказание - внутреннее наследие ЦП из регистров сегмента размера, которое было с 8086 года?