Если вы используете glibc (который вы, вероятно, используете, если вы используете gcc и linux), тогда в unistd.h есть функция syscall, которую вы можете использовать.Он имеет разные реализации для разных архитектур и операционных систем, но реализация выполняется в сборке (может быть встроенной сборкой).syscall
имеет справочную страницу, поэтому:
man syscall
даст вам некоторую информацию.
Если вам просто интересно, как все это работает, вы должны знать, что это изменилосьв линуксе на х86 в последние годы.Первоначально прерывание 0x80 использовалось Linux как обычная точка входа системного вызова на x86.Это работало достаточно хорошо, но поскольку процессоры получили более продвинутую конвейерную обработку (запуск инструкции до выполнения предыдущих инструкций), прерывания замедлились (по сравнению с выполнением обычного кода, который ускорился, хотя некоторые тесты показали, что он замедлился более чемтот).Причина этого заключается в том, что даже когда инструкция int
используется для запуска прерывания, она работает в основном так же, как и аппаратные прерывания, которые происходят непредсказуемо, что приводит к тому, что они не очень хорошо работают с конвейерной обработкой команд (конвейерная обработка работает лучше, когдапути к кодам предсказуемы.)
Чтобы помочь в этом, у более новых процессоров x86 есть инструкции, специально предназначенные для выполнения системных вызовов, но Intel и AMD используют для этого разные инструкции (sysenter
и syscall
соответственно).Кроме того, инструкция Intel systenter
закрывает регистр общего назначения, который Linux использовал в x86_32 для передачи параметра в ядро.Это означает, что программы должны знать, какой из 3 возможных механизмов системных вызовов использовать, а также, возможно, разные способы передачи аргументов ядру.Чтобы обойти все эти новые ядра, сопоставьте специальную страницу памяти с программами (эта страница называется vsyscall, и если вы cat /proc/self/maps
увидите запись для нее), которая содержит код для механизма системных вызовов, который определено ядром, должениспользовать в системе, и более новые версии glib могут реализовать запись о системных вызовах, используя код на этой странице.
Смысл всего этого в том, что это не так просто, как раньше,но если вы просто играете на x86_32, тогда вы сможете использовать инструкцию int 80h
, поскольку она будет поддерживаться в системах, которые могут использовать один из других механизмов для обратной совместимости.