Все 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 объясняет больше деталей.