syscall
instruction предназначен для обеспечения более быстрого способа ввода Ring-0 для выполнения системного вызова. Это должно быть улучшением по сравнению с старым методом, который должен был поднять программное прерывание (int 0x80
на Linux).
Причина в том, что инструкция выполняется быстрее, потому что она не меняет память или даже меняет rsp
, чтобы указать на стек ядра. В отличие от программного прерывания, когда ЦП вынужден разрешить ОС возобновить работу без каких-либо сбоев, для этой команды CPU может предположить, что программное обеспечение знает, что что-то происходит здесь.
В частности, syscall
хранит две части пользовательского пространства в регистрах. RIP
для возврата после вызова сохраняется в rcx
, а флаги хранятся в R11
(because RFLAGS is masked with a kernel-supplied value before entry to the kernel). Это означает, что оба этих регистра сгруппированы по инструкции.
Поскольку они сбиты, в syscall ABI используется другой регистр вместо rcx
, поэтому использование r10
для 4-го аргумента.
r10
является естественным выбором, так как in the x86-64 SystemV ABI он не используется для передачи функций арг и функции не нужно сохранить значение своего абонента из r10
. Таким образом, функция оболочки syscall может mov %rcx, %r10
без сохранения/восстановления. Это было бы невозможно с любым другим регистром, для 6-arg syscalls и функцией вызова функции SysV ABI.
Кстати, 32-битный системный вызов ABI также доступен с sysenter
, который требует сотрудничества между пространством пользователя и ядра пространства, чтобы вернуться к пользовательского пространства после sysenter
. (т. е. сохранение некоторого состояния в пользовательском пространстве перед запуском sysenter
). Это более высокая производительность, чем int 0x80
, но неудобно. Тем не менее glibc использует его (перепрыгивая на код пользовательского пространства на страницах vdso, которые ядро отображает в адресное пространство каждого процесса).
AMD syscall
- это еще один подход к той же идее, что и у Intel sysenter
: сделать вход/выход из ядра менее дорогостоящим, не сохраняя абсолютно все.
В [другом ответе ABI] (http://stackoverflow.com/a/35619528/224132) я выкопал некоторые ссылки на сообщения рассылки amd64 от разработчиков AMD и разработчиков ядра Linux до того, как был выпущен первый силикон AMD64 , Там есть интересные материалы, такие как экспериментальные результаты (от компиляции SPECint и просмотр кода и количества инструкций), которые привели к выбору x86-64 SysV ABI, для которого регистр используется для чего. –