Разница между дальним JMP и дальним CALL в длинном 64-битном режиме - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь понять разницу между командами дальнего JMP и дальнего CALL для процессора x86-64.Если я правильно следую документации Intel для 64-битного длинного режима:

A) Far CALL (код операции 48, FF, /3) или в asm:

call tbyte ptr [rcx]

может использоваться для вызова «сегмента кода» или «шлюза вызова» на один и тот же или другой сегмент кода в зависимости от GDT или LDT используемого селектора сегмента.Где:

  • «Сегмент кода» может указывать только один и тот же вызов уровня привилегий (CPL).Это может быть вызов 32-битного кода режима совместимости или того же самого длинного 64-битного режима (в зависимости от бита L).

  • «Ворота вызова» могут указывать то же самоевызов уровня привилегий (CPL) или вызов между привилегиями.Но он не может перейти в 32-битный режим совместимости и только в тот же самый 64-битный режим.

B) Дальний JMP (код операции 48, FF, /5)) или в asm:

jmp tbyte ptr [rcx] 

Я не могу найти много документации для 64-битного длинного режима.Это почти те же характеристики, что и для дальнего CALL?

Кажется, я не могу найти какую-либо ссылку на межпользовательские JMP "call gate" в другой CPL или на возможность перехода в 32-битный режим совместимости из длинного 64-битного режима.

Может кто-нибудь уточнить это.

1 Ответ

0 голосов
/ 31 мая 2018

Дальний вызов на уровне привилегий возможен в 64-битном режиме через шлюз вызова.Дескриптор сегмента кода, указанный целевым шлюзом вызова, должен быть несоответствующим, а его DPL должен быть меньше, чем CPL.Затем новый CPL устанавливается на DPL.С другой стороны, передача управления между уровнями привилегий невозможна при дальнем прыжке.То есть, если дескриптор сегмента кода, указанный шлюзом вызова, не соответствует требованиям и DPL

Вы не можете JMP для не 64-битногосегмент из 64-битного сегмента.В противном случае возникает GP.

...