SYSENTER на процессорах Intel - PullRequest
       79

SYSENTER на процессорах Intel

0 голосов
/ 10 марта 2020

Так что AFAIK инструкция syscall , является эквивалентом AMD sysenter . Так что в теории нужно только найти инструкцию syscall на чипах AMD, верно? Ну, по-видимому, это не так, поскольку я возился с ntdll.dll и ntdll.dll (версия WOW64), я обнаружил, что обычная версия использует syscall , тогда как ntdll.dll из WOW64 использует SYSENTER . Почему это?

1 Ответ

6 голосов
/ 10 марта 2020

Все x86-64 процессоры поддерживают syscall в 64-битном режиме; это единственный способ сделать 64-битные системные вызовы.

32-битный код использует все, что поддерживает процессор, это быстрее, чем int.


Ваша информация о поддержке только AMD syscall верно только в 32-битном режиме пользовательского пространства (устаревший режим и режим сжатия).

Intel sysenter стал основным выбором для 32-битного пространства пользователя; Intel выиграла эту борьбу за доминирование. Кроме того, очевидно, что устаревший режим AMD syscall является кошмаром для ядра; 32-битные ядра Linux даже не включают его. В 64-битных ядрах Linux разрешен системный вызов из 32-битного пространства пользователя (в режиме Compat) на процессорах AMD, которые поддерживают это. (Некоторые ссылки на соответствующие комментарии о точках входа ядра asm в этот ответ .)

Обратите внимание, что процессоры AMD не поддерживают sysenter в режиме сжатия, только в устаревшем режиме, поэтому в 64-битное ядро, очевидно, вам нужно использовать syscall в 32-битном пользовательском пространстве, если вы хотите избежать медленного int 0x80 на AMD.


AMD64, разработанного AMD64 (который стал x86- 64), и определил новое (довольно хорошее) поведение для syscall работы в 64-битном режиме , которое отличается от того, как оно работает в 32-битном режиме. (Например, в 64-битном пользовательском пространстве он сохраняет старые RFLAGS в R11, который не существует в унаследованном режиме и поэтому не может быть тем, чем он там занимается.)

Intel приняла 64 -bit syscall как часть реализации их версии x86-64 способом, совместимым с AMD. (По модулю некоторые ошибки реализации, например, что происходит, если вы пытаетесь sysret с неканоническим пользователем RCX- адрес возврата пробела; в Intel ошибка принимается с уровнем привилегий = кольцо 0, но с RSP все еще восстановленный стек пользовательского пространства => другой поток может занять ядро. Таким образом, ядра могут безопасно использовать его, только если известен RCX безопасно.)

т.е. инструкция системного вызова AMD выиграла для x86-64, потому что они разработали AMD64, в то время как Intel делала ставку на IA-64 (Itanium); их инструкция syscall стала единственным стандартом, который кто-либо использует на x86-64, потому что нет никакой причины использовать что-либо еще. syscall эффективен и отвечает потребностям разработчиков ядра.

Посылка для выбора инструкции, которая работает на текущем ЦПУ, таким образом, не требуется.


https://reverseengineering.stackexchange.com/questions/16454/struggling-between-syscall-or-sysenter-windows объясняет больше деталей.

...