it-roy-ru.com

Что лучше "int 0x80" или "syscall"?

Я изучил ядро ​​Linux и обнаружил, что для архитектуры x86_64 прерывание int 0x80 не работает как вызов для системного вызова.

Вопрос заключается в следующем: в случае архитектуры x86, что является более предпочтительным syscall или int 0x80 и почему?

EDIT: я использую ядро ​​3.4

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

Предпочтительным способом вызова системного вызова является использование VDSO, части памяти, отображаемой в адресном пространстве каждого процесса, которая позволяет более эффективно использовать системные вызовы (например, вообще не входя в режим ядра). VDSO также заботится о более сложных, по сравнению с унаследованным способом int 0x80, обработке инструкций syscall или sysenter.

Также смотрите это и это .

71
Paweł Dziepak

Мой ответ здесь охватывает ваш вопрос.

На практике в последних ядрах реализовано VDSO , в частности, для динамической оптимизации системных вызовов (ядро устанавливает для VDSO некоторый код, наилучший для текущего процессора). Поэтому вы должны использовать VDSO, и вы лучше будете использовать для существующих системных вызовов интерфейс, предоставляемый libc.

Обратите внимание, что, AFAIK, значительная часть стоимости простых системных вызовов переходит от пространства пользователя к ядру и обратно. Следовательно, для некоторых системных вызовов (вероятно, gettimeofday, getpid ...) VDSO может избежать даже этого (и технически может избежать реального вызова системы). Для большинства системных вызовов (таких как open, read, send, mmap ....) стоимость системного вызова ядра достаточно велика, чтобы можно было улучшить переход от пространства пользователя к пространству ядра (например, используя машинные инструкции SYSENTER или SYSCALL вместо INT). ) незначительный.

19
Basile Starynkevitch

Остерегайтесь этого перед изменением: номера системных вызовов различаются при выполнении 0x80 или syscall, например, sys_write равен 4 с 0x80 и 1 с syscall.

http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html для 32 бит или 0x80 http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64 для системного вызова

7
Thomas